动态属性与属性描述符

属性描述符是什么?

  在解释属性查找顺序之前我们需要了解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类中的代码大大减少,我们能更好地提高代码的分离性

关于属性的查找顺序请看这>属性查找顺序

最新文章

  1. pdo的使用
  2. Python中获取异常(Exception)信息
  3. Java获取当前时间年月日、时间格式化打印、字符串转日期
  4. Java面试题大全(四)
  5. Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题
  6. cocos2d-x之多个移动的小球
  7. poj 3667 Hotel(线段树,区间合并)
  8. storm的安装配置
  9. C#经典面试题 C# 中 Struct 与 Class 的区别,以及两者的适用场合
  10. WINAPI 变量(2861个)
  11. APMServ5.2.6升级PHP
  12. 深入解读ESB与SOA的关系
  13. css中position中的几个属性
  14. 2.SDL规范文档
  15. Xapian的内存索引
  16. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
  17. bash的快捷键、特殊参数、历史命令、相关文件
  18. Python sendmail
  19. 深入学习Motan系列(五)—— 序列化与编码协议
  20. ping 127.0.0.1和ping本地ip分别测试什么?

热门文章

  1. At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger fo
  2. 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.
  3. 一个完整的类用来读取OpenSSL生成的pem格式的x509证书(C#)
  4. SSIM (Structural SIMilarity) 结构相似性
  5. 在shell中判断hive查询记录数大小
  6. Composer 安装 Jira API 库
  7. tengine无法解析ssi报错 Nginx: unsafe URI detected while sending response
  8. pycharm怎么修改python路径
  9. Spring cloud微服务安全实战-3-10API安全机制之授权
  10. MySql存储过程常用的函数