属性与 Getters 和 Setters
Properties vs. Getters and Setters
它被认为是更新 OurClass 的“horrible scenario”,因此 "OurAtt" 是一个介于 0 和 1000 之间的值:
class OurClass:
def __init__(self, a):
self.OurAtt = a
x = OurClass(10)
print(x.OurAtt)
现在,我的问题是为什么我们要依赖 @属性?是因为代码易读性还是其他原因?因为我们可以很好地在 __init__() 方法下进行检查?
class OurClass:
def __init__(self, a):
if a < 0:
self.OurAtt = 0
elif a > 1000:
self.OurAtt = 1000
else:
self.OurAtt = a
您在 __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 method":对于用户来说,它看起来就像 he/she 更改了一个属性。因此,您可以在此过程的后期 - 当用户已经使用该属性时 - 决定在不更改界面的情况下添加一些验证。
最后它更具声明性,因此通常更“Pythonic”。
它被认为是更新 OurClass 的“horrible scenario”,因此 "OurAtt" 是一个介于 0 和 1000 之间的值:
class OurClass:
def __init__(self, a):
self.OurAtt = a
x = OurClass(10)
print(x.OurAtt)
现在,我的问题是为什么我们要依赖 @属性?是因为代码易读性还是其他原因?因为我们可以很好地在 __init__() 方法下进行检查?
class OurClass:
def __init__(self, a):
if a < 0:
self.OurAtt = 0
elif a > 1000:
self.OurAtt = 1000
else:
self.OurAtt = a
您在 __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 method":对于用户来说,它看起来就像 he/she 更改了一个属性。因此,您可以在此过程的后期 - 当用户已经使用该属性时 - 决定在不更改界面的情况下添加一些验证。
最后它更具声明性,因此通常更“Pythonic”。