风火编程--python描述符的使用

描述符的使用

实现了描述符协议: 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

你可能感兴趣的:(python进阶)