使用Property管理属性

python提供了一种友好的getter、setter、deleter类方法的属性管理工具:property。


property()是一个内置函数,它返回一个Property对象,它的用法很简单,将getter、setter、deleter三个方法作为它的参数即可,这些参数都是可选的。
property_obj = property(getter,setter,deleter,doc)
通过这个Property对象可以智能地判断是getter操作、setter操作还是delete操作,见下面的示例。

唯一需要注意的是
使用Property管理时,setter、deleter方法不要返回任何值,也就是说让它返回None(这是默认的),getter方法返回所取属性的值。

例如,对于Person的name属性来说:
class Person: def __init__(self, name, age): self._name = name self._age = age
def set_name(self, name): self._name = name def get_name(self): return
self._name def del_name(self): del self._name name = property(get_name,
set_name, del_name) if __name__ == "__main__": p1 = Person("malongshuai", 23)
print(p1.name) # 自动调用get_name p1.name = "malong" # 自动调用set_name print(p1.name)
# 自动调用get_name del p1.name # 自动调用del_name print(p1.name) # 自动调用get_name,将报错
注意上面**property对象名为name,和对象属性"_name"是不同的,如果相同,则会出现无限递归问题**。

通过name这个property对象,就可以智能地判断是getter操作、setter操作还是deleter操作。

property结合装饰器也一样方便,这正是以前版本的python所常用的功能。
class Person: def __init__(self, name, age): self.name = name self.age = age
@property # 等价于 Name = property(Name) def Name(self): return self.name
@Name.setter # 等价于 Name = Name.setter(Name) def Name(self, name): self.name =
name @Name.deleter # 等价于 Name = Name.deleter(Name) def Name(self): del
self.name if __name__ == "__main__": p1 = Person("malongshuai", 23)
print(p1.Name) # 自动调用get_name p1.Name = "malong" # 自动调用set_name print(p1.Name)
# 自动调用get_name del p1.Name # 自动调用del_name
至于选择使用装饰器结合Property还是直接使用property的内置函数,自行选择,并没有什么区别。

通过Property,还可以返回计算后的值。
class A(): def __init__(self, value): self.value = value def two_time(self,
value): self.value = self.value * 2 def get_value(self): return self.value
Value = property(get_value, two_time) if __name__ == "__main__": a = A(23)
print(a.Value) a.Value = 33 print(a.Value)
Property对象的属性

先看看Property的定义:
class property(object) | property(fget=None, fset=None, fdel=None, doc=None) |
| Property attribute. | | fget | function to be used for getting an attribute
value | fset | function to be used for setting an attribute value | fdel |
function to be used for del'ing an attribute | doc | docstring
这些无需解释。

再看下property的属性:
>>> property.__dict__.keys() dict_keys(['__getattribute__', '__get__',
'__set__', '__delete__', '__init__', '__new__', 'getter', 'setter', 'deleter',
'fget', 'fset', 'fdel', '__doc__', '__isabstractmethod__'])
关注一下它的getter、setter、deleter方法,在前面property结合装饰器的示例中已经使用到了这几个函数。:
deleter(...) Descriptor to change the deleter on a property. getter(...)
Descriptor to change the getter on a property. setter(...) Descriptor to change
the setter on a property.

看方法的文档说明是设置Property对象上的getter、setter、deleter方法,这句话结合前面的"property+装饰器"的示例很容易理解和使用。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信