property属性
property属性的定义和调用注意点:
-
定义时,在实例方法的基础上添加@property 装饰器;并且仅有一个self参数
-
调用时,无需括号
python的property属性的功能是:property属性内部进行一系列的逻辑运算,最终将计算结果返回。
property属性的两种方式:
-
装饰器 即:在方法上应用装饰器
-
类属性 即:在类中定义值为property对象的类属性
property装饰器在经典类中只有一种访问方式 @property。在新式类中有三种访问方式:
1 class Goods: 2 """python3中默认继承object类 3 以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter 4 """ 5 @property 6 def price(self): 7 print('@property') 8 9 @price.setter 10 def price(self, value): 11 print('@price.setter') 12 13 @price.deleter 14 def price(self): 15 print('@price.deleter') 16 17 # ############### 调用 ############### 18 obj = Goods() 19 obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 20 obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数 21 del obj.price # 自动执行 @price.deleter 修饰的 price 方法
注意:
-
经典类中的属性只有一种访问方式,其对应被@property 修饰的方法
-
新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter 修饰的方法
类属性方式,创建值为property对象的类属性:
1 class Foo: 2 def get_bar(self): 3 return 'laowang' 4 5 BAR = property(get_bar) 6 7 obj = Foo() 8 reuslt = obj.BAR # 自动调用get_bar方法,并获取方法的返回值 9 print(reuslt)
property方法中有个四个参数
- 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
- 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
- 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
- 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
1 class Foo(object): 2 def get_bar(self): 3 print("getter...") 4 return 'laowang' 5 6 def set_bar(self, value): 7 """必须两个参数""" 8 print("setter...") 9 return 'set value' + value 10 11 def del_bar(self): 12 print("deleter...") 13 return 'laowang' 14 15 BAR = property(get_bar, set_bar, del_bar, "description...") 16 17 obj = Foo() 18 19 obj.BAR # 自动调用第一个参数中定义的方法:get_bar 20 obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 21 desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description... 22 print(desc) 23 del obj.BAR # 自动调用第三个参数中定义的方法:del_bar方法
Property属性的应用:
1.私有属性添加getter和setter方法:
1 class Money(object): 2 def __init__(self): 3 self.__money = 0 4 5 def getMoney(self): 6 return self.__money 7 8 def setMonet(self, value): 9 if isinstance(value, int): 10 self.__money = value 11 12 else: 13 print("error:不是整形数字")
2.使用property升级getter和setter方法:
1 class Money(object): 2 def __init__(self): 3 self.__money = 0 4 5 def getMoney(self): 6 return self.__money 7 8 def setMoner(self, value): 9 if isinstance(value, int): 10 self.__money = value 11 12 else: 13 print("error:不是整形数字") 14 15 16 # 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoney 17 money = property(getMoney, setMoner) 18 19 20 a = Money() 21 a.money = 100 # 调用setMoney方法 22 print(a.money) # 调用getMoney方法
3.使用property取代getter和setter方法:
重新实现一个属性的设置和读取方法,可以做边界判定
1 class Money(object): 2 def __init__(self): 3 self.__money = 0 4 5 # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性 6 # 当调用获取money的值时,调用装饰器的方法 7 @property 8 def money(self): 9 return self.__money 10 11 # 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性 12 # 当调用修改money的值时,调用这个装饰器的方法 13 @money.setter 14 def money(self, value): 15 if isinstance(value, int): 16 self.__money = value 17 else: 18 print("error:不是整形数字") 19 20 21 a = Money() 22 a.money = 100 23 print(a.money)