property分为两种方式
装饰器 即:在⽅法上应⽤装饰器,被装饰的方法拥有setter,deleter属性
使用装饰方法的属性:方法.setter、方法.deleter 装饰被装饰的方法名
三个装饰器:@property、@方法.setter、@方法.deleter装饰的方法名一样,实现功能不一样
类属性 即:在类中定义值为property对象的类属性
1.新式类,具有三种@property装饰器:
class Goods:
@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修饰的⽅法
proper装饰器的装饰的方法名是一样的
2.类属性⽅式,创建值为property对象的类属性
当使⽤类属性的⽅式创建property属性时, 经典类 和 新式类 ⽆区别
property类属性引用的方法名不一样
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__#自动获取第四个参数中设置的值:descrepation
print(desc)
del obj.BAR#自动调用第三个参数中定义的方法:del_bar方法
property⽅法中有个四个参数
第⼀个参数是⽅法名,调⽤ 对象.属性 时⾃动触发执⾏⽅法
第⼆个参数是⽅法名,调⽤ 对象.属性 = XXX 时⾃动触发执⾏⽅法
第三个参数是⽅法名,调⽤ del 对象.属性 时⾃动触发执⾏⽅法
第四个参数是字符串,调⽤ 对象.属性.doc ,此参数是该属性的描述信息
综上所述:
定义property属性共有两种⽅式,分别是【装饰器】和【类属性】,⽽【装饰器】⽅式针对经典类和新式类⼜有所不同。
通过使⽤property属性,能够简化调⽤者在获取数据的流程