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)
原文地址:https://www.cnblogs.com/zzmx0/p/12735419.html