它被认为是更新OurClass的“horrible scenario”,因此“OurAtt”是0到1000之间的值:
class OurClass:
def __init__(self, a):
self.OurAtt = a
x = OurClass(10)
print(x.OurAtt)
现在,我的问题是为什么我们依赖 @property ?是因为代码易读性还是有其他原因;既然我们可以在__init __()方法下进行检查吗?
class OurClass:
def __init__(self, a):
if a < 0:
self.OurAtt = 0
elif a > 1000:
self.OurAtt = 1000
else:
self.OurAtt = a
答案 0 :(得分:4)
您使用__init__
方法执行检查的事实并不能保证以后无法将值更改为无效值。
例如:
x = OurClass(10)
x.OurAtt = -20
因此,我们希望每次设置ourAtt
值时运行测试。我们可以这样做:
class OurClass:
def __init__(self, a):
self.OurAtt = a
@property
def OurAtt(self):
return self._OurAtt
@OurAtt.setter
def OurAtt(self,a):
if a < 0:
self._OurAtt = 0
elif a > 1000:
self._OurAtt = 1000
else:
self._OurAtt = a
此外,它允许使代码更具可读性:每个setter检查一个特定值是否有效。这通常比检查同一方法中的所有值更好,因为如果我们更改一个值的规范,我们只需要修改相应的 setter 。
另一个优点是验证是在透明的事情中完成的:您不必将属性更改为“setter方法”:对于用户来说,它看起来就像他/她改变了属性。因此,您可以在此过程中稍后 - 当用户已经使用该属性时 - 决定在不更改界面的情况下添加一些验证。
最后它更具说明性,因此通常更“ Pythonic ”。