Python中的动态属性与描述符
程序员文章站
2022-03-20 22:12:15
动态属性与属性描述符 属性描述符是什么? 在解释属性查找顺序之前我们需要了解Python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get、set、delete中的一种即可称作属性描述符。 其中只实现了__get__()的称作非数据描述符,实现了_ ......
动态属性与属性描述符
属性描述符是什么?
在解释属性查找顺序之前我们需要了解python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get、set、delete中的一种即可称作属性描述符。
其中只实现了__get__()的称作非数据描述符,实现了__get__()和__set__()方法的称作数据描述符。
- data.py
class data(): def __get__(self, instance, owner): pass def __set__(self, instance, value): pass def __delete__(self, instance): pass
- nodata.py
class nonedata(): def __get__(self, instance, owner): pass
动态属性
在实际项目的开发中我们有时候需要去将自己的逻辑(方法)变成属性来调用,也就是我们常说的@property动态属性。
- propertytest.py
import numbers class user: def __init__(self): pass @property def age (self): return self.__userage @age.setter def age(self,value): if isinstance(value,numbers.integral): self.__userage = value else: raise valueerror if __name__ == '__main__': user = user() user.age = 30 print(user.age)
- 对用户信息的赋值中,我们需要对值进行判断是否合法,直接在初始化特殊方法中进行判断是无法实现的。因此需要引入动态属性,将判断和赋值在age方法中进行,同时添加@property装饰器,将方法转换为供我们调用的属性。当然我上述的代码合法性判断只写了整数判断,具体的读者可以自行实现。
属性描述符
读到这,肯定很多人者都会有一个疑问,那属性描述符还有什么用呢?我们在设计user类的时候,肯定不只有age这一个属性,如果再加上其他信息属性,那么就会出现大量的@property修饰的方法在同一个类,这是不符合设计原则的,代码的分离性和可读性大大降低。这时候属性描述符就能起到很大的帮助了。
- desc.py
class ageattr: def __get__(self, instance, owner): return self.__userage def __set__(self, instance, value): if isinstance(value,numbers.integral): self.__userage = value else: raise valueerror def __delete__(self, instance): pass class user: age = ageattr() def __init__(self): pass import numbers if __name__ == '__main__': user = user() user.age =25 print(user.age)
- 将代码使用属性描述符重新构造后,user类中的代码大大减少,我们能更好地提高代码的分离性
关于属性的查找顺序请看这>