# 属性描述符
实现以下任意方法就会成为属性描述符
实现一个方法为非数据描述符
同时实现get set 为数据描述符
## 数据描述符
import numbers
class IntField(object):
"""
实现以下任意方法就会成为属性描述符
实现一个方法为非数据描述符
同时实现get set 为数据描述符
"""
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
if not isinstance(value, numbers.Integral):
raise ValueError("must a int num")
self.value = value
def __delete__(self, instance):
pass
# 数据描述符:实现了get 和 set 方法 # 在未赋值前: # 使用User.age 优先使用 __get__ 方法获取age 此刻 age在User.__dict__中 # 调用User.age = 12 会使用 __set__方法 而后使用User.age则是调用__dict__['age'] # 对于user 若__dict__中有 age则调用__dict__['age'] 若无 则调用User中的age 满足上述规则 其中 user.age = 12 会为user增加属性age 非User的age # 对于非属性描述符 则调用 __getattr__ 若无 则 报错AttributeError
##非数据描述符
class NonDataDescriptor(object):
def __get__(self, instance, owner):
return ""
class Person(object):
age = NonDataDescriptor()
# 非数据描述符:实现了get和set的任意一种 # 在未赋值前: # 使用Person.age 优先使用 __get__ 方法获取age 此刻age在User.__dict__中 # 对于非属性描述符User.age则是调用__dict__['age'] # 对于p 若__dict__中有age则调用__dict__['age'] 若无 则调用User中的age 满足上述规则 # 对于非属性描述符 则调用 __getattr__ 若无 则 报错AttributeError