zoukankan      html  css  js  c++  java
  • Python 属性描述符和属性的查找过程

    属性描述符可以用来控制给属性赋值的时候的一些行为 

    import numbers
    class 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')
            self.value = value
        def __delete__(self, instance):
            pass
    
    class User:
        age = IntField()
    if __name__ == '__main__':
        user = User()
        user.age = 30 #此语句相当于执行了属性描述符中的__set__()方法。形数value对应实参30
        print(user.age)

       此代码中自定义的IntField类就是属性描述符类,属性描述根据其实现的魔法方法分为数据描述符和非数据描述符,两者的优先级别不一样。如果定义了属性描述符,那么在下面的类中定义属性的时候,如果属性是属性描述符的实例,那么再给属性赋值的时候就会先调用属性描述符中的__set__方法。

    数据描述符:

      类中同时实现了__get__ 和__set__方法。

    非数据描述符

      类中只实现了__get__ 方法。

    属性描述符中属性的查找顺序 

    user = User(),那么user.age顺序如下:

    1. 到数据描述符中调用__get__方法。
    2. 查找自身实例的age属性
    3. 调用对象的age属性。如果没有
    4. 调用非数据描述符的__get__方法。
    5. 如果有__getattr__方法,调用其方法
    6. 都没有抛出异常
  • 相关阅读:
    Android笔记:数据储存
    Android笔记:管理所有活动
    Android随笔:属性
    Android笔记:限定符
    Android笔记:ninepatch
    Android笔记:获取屏幕信息
    js自动完成
    动态生成实体类
    EF框架学习手记
    js遮罩效果
  • 原文地址:https://www.cnblogs.com/yc3110/p/10455180.html
Copyright © 2011-2022 走看看