风火编程--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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值