[英]Confused about the property decorator and its related getter/setter methods
我一直在做一些Python,但我意识到实际上对属性装饰器并不了解很多,所以我尝试制作一个简单的示例。 这是我使用的代码:
class foo():
def __init__(self):
self.__test = 0
@property
def test(self):
return self.__test
@test.setter
def test(self, value):
self.__test = value
@test.getter
def test(self):
self.__test += 1
return self.__test
然后,我开始在交互式外壳中使用它:
>>> bar = foo()
>>> bar.test
1
>>> bar.test
2
到目前为止,该对象的行为符合我的预期。
然后我尝试检查setter方法
>>> bar.test = 5
>>> bar.test
5
>>> bar.test
5
奇怪的。 由于某种原因,__test的值未增加。
>>> bar._foo__test
2
我以为我将__test设置为等于5。
这是怎么回事?
问题在于您的foo
类是旧样式类,描述符(以及此类属性)仅旨在与新样式类一起使用。
从文档 :
请注意,描述符仅针对新样式的对象或类调用(如果类从对象或类型继承,则该类是新样式)
在这种情况下,使用旧样式类设置bar.test = 5
会在实例dict中创建一个test
属性,该属性会bar.test = 5
该类dict的属性:
>>> bar = foo()
>>> foo.__dict__
{'test': <property object at 0x7f302e64c628>, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x7f302e658b18>}
>>> bar.test # test property from class dict is used
1
>>> bar.__dict__
{'_foo__test': 1}
>>> bar.test = 5 # sets test on instance
>>> bar.__dict__
{'test': 5, '_foo__test': 1}
所以解决方案很简单:通过从object
继承,使foo
为新样式类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.