博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
元类编程--__get__ __set__属性描述符
阅读量:7041 次
发布时间:2019-06-28

本文共 1901 字,大约阅读时间需要 6 分钟。

from datetime import date, datetimeimport numbersclass IntField:    #数据描述符,实现以下任意一个,都会变为属性描述符    def __get__(self, instance, owner):        return self.value    def __set__(self, instance, value): #判断类型        if not isinstance(value, numbers.Integral):            raise ValueError("int value need")        if value < 0:            raise ValueError("positive value need")        self.value = value    def __delete__(self, instance):        passclass NonDataIntField:    #非数据属性描述符    def __get__(self, instance, owner):        return self.valueclass User:    age = IntField()    # age = NonDataIntField()'''如果user是某个类的实例,那么user.age(以及等价的getattr(user,’age’))首先调用__getattribute__。如果类定义了__getattr__方法,那么在__getattribute__抛出 AttributeError 的时候就会调用到__getattr__,而对于描述符(__get__)的调用,则是发生在__getattribute__内部的。user = User(), 那么user.age 顺序如下:(1)如果“age”是出现在User或其基类的__dict__中, 且age是data descriptor, 那么调用其__get__方法, 否则(2)如果“age”出现在user的__dict__中, 那么直接返回 obj.__dict__[‘age’], 否则(3)如果“age”出现在User或其基类的__dict__中(3.1)如果age是non-data descriptor,那么调用其__get__方法, 否则(3.2)返回 __dict__[‘age’](4)如果User有__getattr__方法,调用__getattr__方法,否则(5)抛出AttributeError'''# class User:##     def __init__(self, name, email, birthday):#         self.name = name#         self.email = email#         self.birthday = birthday#         self._age = 0##     # def get_age(self):#     #     return datetime.now().year - self.birthday.year##     @property#     def age(self):#         return datetime.now().year - self.birthday.year##     @age.setter#     def age(self, value):#         #检查是否是字符串类型#         self._age = valueif __name__ == "__main__":    user = User()    user.__dict__["age"] = "abc"    print (user.__dict__)    print (user.age)    # print (getattr(user, 'age'))    # user = User("bobby", date(year=1987, month=1, day=1))    # user.age = 30    # print (user._age)    # print(user.age)

 

转载于:https://www.cnblogs.com/Erick-L/p/8876916.html

你可能感兴趣的文章
Microsoft CRM 2013 设置默认组织 default organization
查看>>
【理论基础】ContentProvider的简要概述
查看>>
加快某云下载速度。。。
查看>>
【LeetCode】169 - Majority Element
查看>>
爱上MVC3系列~改变Areas的FindView顺序
查看>>
Where is the warnings view in Android Studio?
查看>>
pycharm中的flask项目如何开启debug模式
查看>>
SpringMVC 利用@ResponseBody注解返回Json时,出现406 not acceptable 错误的解决方法。
查看>>
成为Java GC专家(5)—Java性能调优原则
查看>>
Java TreeMap 源码解析
查看>>
VML+js 完成网页版扫雷
查看>>
如何修改全部DevExpress控件的字体
查看>>
ntp服务器
查看>>
子线程中刷新了UI
查看>>
UIPopoverController事件分发
查看>>
记一次在线安装postgresql-9.4的问题
查看>>
zabbix/自动发现规则
查看>>
SQL Server 命令行操作
查看>>
GD32F450 200M时USB不稳定
查看>>
java.util.Date java.sql.Date java.util.Date,String,long 类型数据之间的转化
查看>>