python对象属性管理(2):property管理属性
2023-09-11 14:18:05 时间
使用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+装饰器"的示例很容易理解和使用。
相关文章
- Python脚本写端口扫描器(socket,python-nmap)
- [读书]Python学习手冊--属性管理1
- python魔法方法之-Python __repr__()方法:显示属性
- 如何利用python读取图片属性信息
- 将不规则的Python多维数组拉平到一维
- Python 动态获取对象的属性和方法(内含inspect)
- Python 属性与方法 概念理解
- 【零基础学python】:清华官方出品的《看漫画学Python》全彩PDF,495页资源分享
- Python 在运维中应用有多重要
- 带你看看python的工资!你再来决定要不要学习python?
- 【python实战】拒绝黄牛!我要用python原价冲周董演唱会~Python自动秒杀抢票脚本
- 97 python高级 - 属性property
- 54 python - 类属性、实例属性
- Python数据可视化2.7 Python中的可视化工具
- 《python 与数据挖掘 》一 第2章 Python基础入门
- 20220721 python for循环学习
- python 类属性装饰器
- 《Python机器学习——预测分析核心算法》——2.3 对“岩石vs.水雷”数据集属性的可视化展示
- python的dir()和__dict__属性的区别
- OpenCV Python – 如何计算和绘制图像区域直方图?
- python中不同方法的按索引读取数组的性能比较——哪种按索引读取数组的性能更好
- Python 工具 之 Windows 上 python 虚拟环境的搭建与简单使用的相关说明
- 【Python注意事项】如何理解python中间generator functions和yield表情