• Python属性描述符


    实现了__get__、set、__delete__中任意一个方法的类,称之为属性描述符。
    属性描述符可以控制属性操作时的一些行为。
    只要具有__get__方法的类就是描述符类。
    如果一个类中具有__get__和__set__两个方法,那么就是数据描述符。
    如果一个类中只有__get__方法,那么是非数据描述符。

    
    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 need")
            self.value = value
    
        def __delete__(self, instance):
            pass
    
    
    class NonDateField:
        def __get__(self, instance, owner):
            return self.value
    
    
    class User:
        age = IntField()
        name = NonDateField()
    
    
    if __name__ == "__main__":
        u = User()
        u.age = 30
    
    

    如果user是某个类的实例,那么user.age(以及等价的getattr(user, ‘age’))首先调用__getattribute__。如果类定义了__getattr__方法。那么在__getattribute__抛出AttributeError的时候就会调用__getattr__。
    描述符的调用(get)发生在__getattribute__内部。user = User(),那么user.age顺序如下:
    1、如果age出现在User或其基类的__dict__中,并且age是数据描述符,那么调用数据描述符的__get__
    2、如果age出现在user的__dict__中,那么直接返回user.dict["age"]
    3、如果age出现在User或其基类的__dict__中:
    3.1 如果age是non-data descriptor,那么调用其__get__方法;
    3.2 否则返回__dict__["age"]
    4、如果User有__getattr__方法,在__getattribute__抛AttributeError之后调用其__getattr__;
    5、否则抛出AttributeError并挂掉程序

    简而言之就是:类中数据描述符属性>对象中>类中非数据描述符属性>类属性

  • 相关阅读:
    @loj
    @codeforces
    @bzoj
    @hdu
    @poj
    @loj
    @bzoj
    @bzoj
    Python配合BeautifulSoup读取网络图片并保存在本地
    Java--多线程读取网络图片并保存在本地
  • 原文地址:https://www.cnblogs.com/byron0918/p/10575745.html
Copyright © 2020-2023  润新知