Python特性property解析

python 编码中,当需要绑定属性操作的时候,直接把属性暴露出去是不安全的,谁都可以更改属性值,不符合逻辑和编码规范。在绑定属性的时候,要对绑定的值进行验证。

class LineItem:
    def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight
        self.price = price

    def subtotal(self):
        return self.weight * self.price


if __name__ == '__main__':
    raisins = LineItem('Golden raisins', 10, 6.95)
    print(raisins.subtotal())  # 输出 69.5
    raisins.weight = -10
    print(raisins.subtotal())  # 输出 -69.5

自己设置商品重量为 -10 也是可以的,无法在类中进行验证。添加属性的验证,就是@property存在意义了。

"""使用特性验证属性"""


class LineItem:
    def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight
        self.price = price

    def subtotal(self):
        return self.weight * self.price

    @property
    def weight(self):
        return self.__weight

    @weight.setter
    def weight(self, value):
        if value > 0:
            self.__weight = value
        else:
            raise ValueError('value must be > 0')
            
	@weight.getter
    def weight(self):
        return self.__weight * 10

if __name__ == '__main__':
    raisins = LineItem('Golden raisins', 10, 6.95)
    print(raisins.subtotal())  # 输出 69.5
    raisins.weight = -10       # ValueError: value must be > 0
    print(raisins.subtotal())

示例代码来自《流畅的python》

  1. @property本身又创建了装饰器@weight.setter @weight.getter 和 给属性weight设置了setter|getter方法。 因此对weight属性的操作就可控了。
  2. @property 还可以定义只读属性
  3. 必要的地方使用,可以简化代码,减少出错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值