与属性混淆

发布于 2021-01-29 15:04:18

我是使用属性的新手,因此我进行了如下所示的简单测试。在测试中,我创建了两个类“ 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()
关注者
0
被浏览
69
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    文档

    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)
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看