描述符的使用
实现了描述符协议: get, set, delete__方法中的一个或多个操作__dict__的类, 对多个属性使用相同的逻辑进行操作.
创建描述符的一个实例作为其他类的类属性, 在进行初始化的时候定义同名的实例属性就会遵守描述符的约束.
没有实现__set()的是非覆盖型描述符, 如果通过实例设置同名属性, 描述符会被覆盖.
DEMO
class Quantity:
"""自然量的描述符"""
# __counter = 0
def __init__(self, name, type_):
self.name= name
self.type_= type_
def __get__(self, instance, cls):
# return instance.__dict__[self.name]
return getattr(instance, self.name)
def __set__(self, instance, value):
if value > 0:
# instance.__dict__[self.name]=self.value
setattr(instance, self.name, value)
else:
raise ValueError("value must > 0")
def __del__(self, instance, cls):
del instance.__dict__[self.name]
def entity(cls):
"""修改描述符storage_name的类装饰器"""
for key, attr in cls.__dict__.items():
if isinstance(attr, Quantity):
attr.storage_name = "_Quantity#{}".format(key)
return cls
@entity
class Goods:
"""商品类"""
price = Quantity()
def __init__(self, price):
self.price = price
if __name__ == '__main__':
g1 = Goods(50)
print(g1.price)
print(vars(g1))
# g2 = Goods(-50) # 打开会抛出ValueError