属性与Getters和Setter

时间:2017-07-04 11:28:54

标签: python properties init

它被认为是更新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

1 个答案:

答案 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 ”。