ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 用起来像是使用的实例属性一样的特殊属性,可以对应某个方法 # 经典类 ~~~ class Foo: def func(self): pass # 定义property属性 @property def prop(self): return 10 # 调用 foo_obj = Foo() foo_obj.func() # 调用实例方法 print(foo_obj.prop) # 调用property属性 ~~~ 注意: * 定义时,在实例方法的基础上添加@property装饰器,并且仅有一个self参数 * 调用时,无需括号 # 新式类 ~~~ class Goods: ''' py3才有@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 @price.setter @price.deleter ~~~ 注意: * 经典类中的属性只有一种访问方式,其对应被@property修饰的方法 * 新式类中的属性有三种访问方式,并分别对应了三个被@property, @方法名.setter, @方法名.deleter # property属性 类属性方式,创建值为property对象的类属性 * 当使用类属性的方式创建property属性时,经典类和新式类无区别 ~~~ class Foo: def get_bar(self): return 'laowang' bar = property(get_bar) obj = Foo() result = obj.bar print(result) ~~~ property方法中有四个参数 * 第一个参数是方法名,调用`对象.属性`自动触发执行方法 * 第二个参数是方法名,调用`对象.属性=xx`时自动触发执行方法 * 第三个参数是方法名,调用`del 对象.属性`时自动触发执行方法 * 第四个参数是字符串,调用`对象.属性.__doc__`,此参数是该属性的描述信息 ~~~ 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 # 自动调用第一个参数中的定义的方法 obj.BAR = 'alex' # 自动调用第二个参数中定义的方法: set_bar方法,并将'alex'当做参数传入 desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description print(desc) del obj.BAR # 自动调用第三个参数中定义的方法: del_bar方法 ~~~ 输出 ~~~ getter... setter... description... deleter... ~~~ # 应用 使用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方法 ~~~