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》
- @property本身又创建了装饰器@weight.setter @weight.getter 和 给属性weight设置了setter|getter方法。 因此对weight属性的操作就可控了。
- @property 还可以定义只读属性
- 必要的地方使用,可以简化代码,减少出错。