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__方法。spa

數據描述符:

  類中同時實現了__get__ 和__set__方法。code

非數據描述符

  類中只實現了__get__ 方法。對象

屬性描述符中屬性的查找順序 

user = User(),那麼user.age順序以下:blog

  1. 到數據描述符中調用__get__方法。
  2. 查找自身實例的age屬性
  3. 調用對象的age屬性。若是沒有
  4. 調用非數據描述符的__get__方法。
  5. 若是有__getattr__方法,調用其方法
  6. 都沒有拋出異常
相關文章
相關標籤/搜索