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