2

我是使用属性的新手,所以我整理了一个简单的测试,如下所示。在我的测试中,我创建了两个类“Test1”和“Test2”,每个类都包含一个值。我正在尝试使用属性来管理对伪隐藏“val”属性的访问。此当前测试不限制“val”属性的任何输入或输出,因为该程序仅作为概念证明。下面显示的两个测试类产生相同的结果,并且应该代表构造属性的不同方法。我所指的属性的示例可在此处的 python 文档中找到。

根据文档

如果c 是C 的一个实例,cx 将调用getter,cx = value 将调用setter,del cx 将调用deleter。

其中 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()
4

1 回答 1

4

文档

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)

阅读更多关于新式课程和经典课程的区别

于 2012-10-17T17:04:07.993 回答