首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Python中的@foo.setter对我不起作用?

为什么Python中的@foo.setter对我不起作用?
EN

Stack Overflow用户
提问于 2009-02-28 14:33:51
回答 3查看 81.3K关注 0票数 160

所以,我正在使用Python2.6中的装饰器,我在让它们工作时遇到了一些问题。下面是我的类文件:

代码语言:javascript
复制
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并对其进行了检查:

代码语言:javascript
复制
>>> 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不起作用了!

我遗漏了什么?

EN

回答 3

Stack Overflow用户

发布于 2013-07-01 07:20:33

对于在这里遇到这个异常的其他人,请注意:这两个函数需要具有相同的名称。按如下方式命名方法将导致异常:

代码语言:javascript
复制
@property
def x(self): pass

@x.setter
def x_setter(self, value): pass

取而代之的是为这两种方法指定相同的名称

代码语言:javascript
复制
@property
def x(self): pass

@x.setter
def x(self, value): pass

同样需要注意的是,声明的顺序很重要。必须在文件中的setter之前定义getter,否则将得到一个NameError: name 'x' is not defined

票数 88
EN

Stack Overflow用户

发布于 2009-02-28 14:43:23

您需要使用新样式的类,这是通过从object派生类来实现的:

代码语言:javascript
复制
class testDec(object):
   ....

那么它应该是有效的。

票数 24
EN

Stack Overflow用户

发布于 2015-02-12 05:23:33

如果有人从谷歌来这里,除了上面的答案之外,我想补充的是,当从您的类的__init__方法调用setter时,需要特别注意这一点,特别是基于this answer

代码语言:javascript
复制
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
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/598077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档