属性与 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”。