我是使用属性的新手,因此我进行了如下所示的简单测试。在测试中,我创建了两个类“ Test1”和“ Test2”,每个类都持有一个值。我正在尝试使用属性来控制对伪隐藏的“ val”属性的访问。当前测试不限制“ val”属性的任何输入或输出,因为该程序仅是概念证明。下面显示的两个测试类产生相同的结果,并被认为代表了构造属性的不同方法。我要引用的属性的示例使用在python docs上找到。
根据文档:
如果c是C的实例,则cx将调用getter,cx = value将调用setter,而del cx是删除器。
其中C是他们的测试班级。我认为通过按我的方式设置值可以更改_val并将val保留为属性。但是在我看来,5除非我弄错了,否则我访问属性设置器的方法实际上是用整数替换属性。我希望有人可以澄清我的困惑。
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()
从文档:
property([fget[, fset[, fdel[, doc]]]]) 返回 新样式类 (从对象派生的 类) 的属性属性。
property([fget[, fset[, fdel[, doc]]]])
返回 新样式类 (从对象派生的 类) 的属性属性。
描述符仅为新样式对象或类调用。您使用的是老式类。从基本类型继承object:
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)
阅读有关新型类和经典类之间的区别的更多信息。