1. 什么是property属性

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

# ############### 定义 ###############

class Foo:

def func(self):

pass

# 定义property属性

@property

def prop(self):

pass

# ############### 调用 ###############

foo_obj = Foo()

foo_obj.func() # 调用实例方法

foo_obj.prop # 调用property属性

如下的例子用于说明如何定一个简单的property属性:

class Goods(object):

@property

def size(self):

return 100

g = Goods()

print(g.size)

property属性的定义和调用要注意一下几点:

定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数

调用时,无需括号

2. 简单的实例

对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:

根据用户请求的当前页和总数据条数计算出 m 和 n

根据m 和 n 去数据库中请求数据

# ############### 定义 ###############

class Pager:

def __init__(self, current_page):

# 用户当前请求的页码(第一页、第二页...)

self.current_page = current_page

# 每页默认显示10条数据

self.per_items = 10

@property

def start(self):

val = (self.current_page - 1) * self.per_items

return val

@property

def end(self):

val = self.current_page * self.per_items

return val

# ############### 调用 ###############

p = Pager(1)

p.start # 就是起始值,即:m

p.end # 就是结束值,即:n

从上述可见:

Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。

3. property属性的有两种方式

装饰器 即:在方法上应用装饰器

类属性 即:在类中定义值为property对象的类属性

3.1 装饰器方式

在类的实例方法上应用@property装饰器

Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类 )

经典类,具有一种@property装饰器:

# ############### 定义 ###############

class Goods:

@property

def price(self):

return "laowang"

# ############### 调用 ###############

obj = Goods()

result = obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

print(result)

新式类,具有三种@property装饰器:

#coding=utf-8

# ############### 定义 ###############

class Goods:

"""python3中默认继承object类

以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter

"""

@property

def price(self):

print('@property')

@price.setter

def price(self, value):

print('@price.setter')

@price.deleter

def price(self):

print('@price.deleter')

# ############### 调用 ###############

obj = Goods()

obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数

del obj.price # 自动执行 @price.deleter 修饰的 price 方法

注意:

经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法

新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法

由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

class Goods(object):

def __init__(self):

# 原价

self.original_price = 100

# 折扣

self.discount = 0.8

@property

def price(self):

# 实际价格 = 原价 * 折扣

new_price = self.original_price * self.discount

return new_price

@price.setter

def price(self, value):

self.original_price = value

@price.deleter

def price(self):

del self.original_price

obj = Goods()

obj.price # 获取商品价格

obj.price = 200 # 修改商品原价

del obj.price # 删除商品原价

3.2 类属性方式,创建值为property对象的类属性

当使用类属性的方式创建property属性时,经典类和新式类无区别

class Foo:

def get_bar(self):

return 'laowang'

BAR = property(get_bar)

obj = Foo()

reuslt = obj.BAR # 自动调用get_bar方法,并获取方法的返回值

print(reuslt)

property方法中有个四个参数

第一个参数是方法名,调用 对象.属性 时自动触发执行方法

第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法

第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息

#coding=utf-8

class Foo(object):

def get_bar(self):

print("getter...")

return 'laowang'

def set_bar(self, value):

"""必须两个参数"""

print("setter...")

return 'set value' + value

def del_bar(self):

print("deleter...")

return 'laowang'

BAR = property(get_bar, set_bar, del_bar, "description...")

obj = Foo()

obj.BAR # 自动调用第一个参数中定义的方法:get_bar

obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入

desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description...

print(desc)

del obj.BAR # 自动调用第三个参数中定义的方法:del_bar方法

由于类属性方式创建property属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

class Goods(object):

def __init__(self):

# 原价

self.original_price = 100

# 折扣

self.discount = 0.8

def get_price(self):

# 实际价格 = 原价 * 折扣

new_price = self.original_price * self.discount

return new_price

def set_price(self, value):

self.original_price = value

def del_price(self):

del self.original_price

PRICE = property(get_price, set_price, del_price, '价格属性描述...')

obj = Goods()

obj.PRICE # 获取商品价格

obj.PRICE = 200 # 修改商品原价

del obj.PRICE # 删除商品原价

综上所述:

定义property属性共有两种方式,分别是【装饰器】和【类属性】,而【装饰器】方式针对经典类和新式类又有所不同。

通过使用property属性,能够简化调用者在获取数据的流程

4. property属性-应用

4.1. 私有属性添加getter和setter方法

class Money(object):

def __init__(self):

self.__money = 0

def getMoney(self):

return self.__money

def setMoney(self, value):

if isinstance(value, int):

self.__money = value

else:

print("error:不是整型数字")

4.2. 使用property升级getter和setter方法

class Money(object):

def __init__(self):

self.__money = 0

def getMoney(self):

return self.__money

def setMoney(self, value):

if isinstance(value, int):

self.__money = value

else:

print("error:不是整型数字")

# 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney

money = property(getMoney, setMoney)

a = Money()

a.money = 100 # 调用setMoney方法

print(a.money) # 调用getMoney方法

#100

4.3. 使用property取代getter和setter方法

重新实现一个属性的设置和读取方法,可做边界判定

class Money(object):

def __init__(self):

self.__money = 0

# 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法

@property

def money(self):

return self.__money

# 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法

@money.setter

def money(self, value):

if isinstance(value, int):

self.__money = value

else:

print("error:不是整型数字")

a = Money()

a.money = 100

print(a.money)

python中的property_python中的property属性相关推荐

  1. php property 获取,JavaScript中如何获取和设置property属性代码详解

    JavaScript中对象的property有三个属性: 1.writable.该property是否可写. 2.enumerable.当使用for/in语句时,该property是否会被枚举. 3. ...

  2. python装饰器property_python装饰器: @property

    原文链接:https://blog.csdn.net/YiJie__ShuSheng/article/details/84933648 1. 什么是property属性 一种用起来像是使用的实例属性一 ...

  3. python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)

    Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...

  4. python装饰器 property_python中property和setter装饰器用法

    作用:调用方法改为调用对象, 比如 : p.set_name() 改为 p.set_name 区别:前者改变get方法,后者改变set方法 效果图: 代码: class Person: def __i ...

  5. python装饰器 property_python装饰器--@property

    原博文 2016-08-21 19:50 − @property 考察 Student 类: class Student(object): def __init__(self, name, score ...

  6. python 中 property 属性的讲解及应用

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 装饰器 即:在方法上应用装饰器 类属性 即:在类中定义 ...

  7. Python中菱形继承的MRO顺序及property属性

    Python中菱形继承的MRO顺序及property属性 文章目录 Python中菱形继承的MRO顺序及property属性 一.Python中菱形继承的MRO顺序 1. 单独调用父类的方法 2. 多 ...

  8. python内置装饰器property_Python中的内置装饰器之property

    装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能: Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 相关知识点 ...

  9. python中属性和类级变量_六、Python类变量和实例变量(类属性和实例属性)

    我们知道,无论是在类中定义的属性还是方法,在类的外部,都无法直接调用它们,因此,我们完全可以把类看做是一个独立的作用域(称为类命名空间),则类属性其实就是定义在类命名空间内的变量(类方法其实就是定义的 ...

最新文章

  1. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
  2. 波士顿动力CEO:不排斥军方订单,就想你粗暴地对待机器狗
  3. Mr.J-- jQuery学习笔记(二十七)--DOM操作方法(删除获取文本)
  4. git remote prune,git prune,git fetch --prune等有什么区别
  5. easyui-textbox 和 easyui-validatebox 设置值和获取值
  6. visio保存后公式变形_固体力学中的变形分析
  7. git根据commit生成patch(转载)
  8. matlab对样本方差区间估计,已知样本均值和样本方差做区间估计
  9. 输出希腊字母表java
  10. 记一次使用npm命令报错
  11. UE4 引擎 package 可执行文件过程中碰到fatal error的常见解决方法
  12. 2014年华为收入122亿美元
  13. 爬取抖音数据实践方案《进阶版》
  14. 「数据架构」:主数据管理(MDM)对我的行业有什么帮助?
  15. 方舟手游服务器gg修改,【修改贴】关于单机版gg修改器的应用。
  16. 平面直角坐标系中的旋转公式_大理石旋转楼梯测量方式及旋转楼梯案例大全
  17. PC和PU材质最常见
  18. css3弹性盒模型兼容性,彻底弄懂css3的flex弹性盒模型
  19. merge语句中同时执行多个update或者insert操作
  20. 计算中英文字符串的长度!

热门文章

  1. Nginx - 代理、缓存
  2. Redis线程IO模型的秘密知多少
  3. 前沿 | 美国白宫AI峰会闭幕:特朗普政府5大措施加速布局AI生态
  4. python PIL.Image使用
  5. 二、Java面向对象(7)_封装思想——访问修饰符
  6. ZSH and oh-my-zsh 强强联合
  7. MathType使用中的四个小技巧
  8. 开源云操作系统:找到适合自己的应用模式
  9. asp.net中验证码的实现
  10. OJ1028: I love 闰年!