【问题标题】:Properties vs. Getters and Setters属性与 Getter 和 Setter
【发布时间】:2017-07-04 11:28:54
【问题描述】:

已将 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

【问题讨论】:

标签: python properties init


【解决方案1】:

您在 __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”。

【讨论】: