小编典典

与属性混淆

python

我是使用属性的新手,因此我进行了如下所示的简单测试。在测试中,我创建了两个类“ Test1”和“
Test2”,每个类都持有一个值。我正在尝试使用属性来控制对伪隐藏的“ val”属性的访问。当前测试不限制“
val”属性的任何输入或输出,因为该程序仅是概念证明。下面显示的两个测试类产生相同的结果,并被认为代表了构造属性的不同方法。我要引用的属性的示例使用在python
docs上找到

根据文档

如果c是C的实例,则cx将调用getter,cx = value将调用setter,而del cx是删除器。

其中C是他们的测试班级。我认为通过按我的方式设置值可以更改_val并将val保留为属性。但是在我看来,5除非我弄错了,否则我访问属性设置器的方法实际上是用整数替换属性。我希望有人可以澄清我的困惑。

class Test1:
    def __init__(self):
        self._val = 0

    def setVal(self,newVal):
        self._val = newVal
    val = property(lambda self: self._val, setVal, None, "Property for value")

    def __str__(self):
        return "Value: {}".format(self.val)

class Test2:
    def __init__(self):
        self._val = 0

    @property
    def val(self):
        return self._val

    @val.setter
    def setVal(self,newVal):
        self._val = newVal

    def __str__(self):
        return "Value: {}".format(self.val)

def verify(a):
    print("\nCheck with {}".format(a.__class__.__name__))
    print("Value check:",a.val)
    a.val = 5
    print("Value after a.val = 5 is:",a.val)
    print("The actual value is:",a._val)

def main():
    verify(Test1())
    verify(Test2())

if __name__ == '__main__':
    main()

阅读 211

收藏
2021-01-20

共1个答案

小编典典

文档

property([fget[, fset[, fdel[, doc]]]])

返回 新样式类 (从对象派生的 类) 的属性属性。

描述符仅为新样式对象或类调用。您使用的是老式类。从基本类型继承object

class Test1(object):
    # your code

class Test2(object):
    def __init__(self):
        self._val = 0

    @property
    def val(self):
        return self._val

    @val.setter
    def val(self,newVal): # should be named as property
        self._val = newVal

    def __str__(self):
        return "Value: {}".format(self.val)

这项工作很好:

>>> verify(Test1())

Check with Test1
('Value check:', 0)
('Value after a.val = 5 is:', 5)
('The actual value is:', 5)

阅读有关新型类和经典类之间的区别的更多信息。

2021-01-20