所以,我正在使用Python2.6中的装饰器,我在让它们工作时遇到了一些问题。下面是我的类文件:
class testDec:
@property
def x(self):
print 'called getter'
return self._x
@x.setter
def x(self, value):
print 'called setter'
self._x = value
我认为这意味着将x
视为属性,但在get和set上调用这些函数。因此,我启动了IDLE并对其进行了检查:
>>> from testDec import testDec
from testDec import testDec
>>> t = testDec()
t = testDec()
>>> t.x
t.x
called getter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "testDec.py", line 18, in x
return self._x
AttributeError: testDec instance has no attribute '_x'
>>> t.x = 5
t.x = 5
>>> t.x
t.x
5
很明显,第一个调用如预期的那样工作,因为我调用了getter,并且没有默认值,所以它失败了。好,很好,我明白了。但是,调用赋值t.x = 5
似乎创建了一个新的属性x
,现在getter不起作用了!
我遗漏了什么?
发布于 2013-07-01 07:20:33
对于在这里遇到这个异常的其他人,请注意:这两个函数需要具有相同的名称。按如下方式命名方法将导致异常:
@property
def x(self): pass
@x.setter
def x_setter(self, value): pass
取而代之的是为这两种方法指定相同的名称
@property
def x(self): pass
@x.setter
def x(self, value): pass
同样需要注意的是,声明的顺序很重要。必须在文件中的setter之前定义getter,否则将得到一个NameError: name 'x' is not defined
发布于 2009-02-28 14:43:23
您需要使用新样式的类,这是通过从object派生类来实现的:
class testDec(object):
....
那么它应该是有效的。
发布于 2015-02-12 05:23:33
如果有人从谷歌来这里,除了上面的答案之外,我想补充的是,当从您的类的__init__
方法调用setter时,需要特别注意这一点,特别是基于this answer:
class testDec(object):
def __init__(self, value):
print 'We are in __init__'
self.x = value # Will call the setter. Note just x here
#self._x = value # Will not call the setter
@property
def x(self):
print 'called getter'
return self._x # Note the _x here
@x.setter
def x(self, value):
print 'called setter'
self._x = value # Note the _x here
t = testDec(17)
print t.x
Output:
We are in __init__
called setter
called getter
17
https://stackoverflow.com/questions/598077
复制相似问题