Python中的动态属性与描述符
2024-08-27 01:58:09
动态属性与属性描述符
属性描述符是什么?
在解释属性查找顺序之前我们需要了解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类中的代码大大减少,我们能更好地提高代码的分离性
关于属性的查找顺序请看这>属性查找顺序
最新文章
- pdo的使用
- Python中获取异常(Exception)信息
- Java获取当前时间年月日、时间格式化打印、字符串转日期
- Java面试题大全(四)
- Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题
- cocos2d-x之多个移动的小球
- poj 3667 Hotel(线段树,区间合并)
- storm的安装配置
- C#经典面试题 C# 中 Struct 与 Class 的区别,以及两者的适用场合
- WINAPI 变量(2861个)
- APMServ5.2.6升级PHP
- 深入解读ESB与SOA的关系
- css中position中的几个属性
- 2.SDL规范文档
- Xapian的内存索引
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
- bash的快捷键、特殊参数、历史命令、相关文件
- Python sendmail
- 深入学习Motan系列(五)—— 序列化与编码协议
- ping 127.0.0.1和ping本地ip分别测试什么?
热门文章
- At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger fo
- 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.
- 一个完整的类用来读取OpenSSL生成的pem格式的x509证书(C#)
- SSIM (Structural SIMilarity) 结构相似性
- 在shell中判断hive查询记录数大小
- Composer 安装 Jira API 库
- tengine无法解析ssi报错 Nginx: unsafe URI detected while sending response
- pycharm怎么修改python路径
- Spring cloud微服务安全实战-3-10API安全机制之授权
- MySql存储过程常用的函数