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

因此,我正在使用Python 2.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,并且没有默认值,并且失败。好,很好,我了解。但是,对assign的调用t.x = 5似乎会创建一个新属性x,而现在getter无效!


我想念什么?


忽然笑
浏览 532回答 3
3回答

largeQ

只是为那些偶然发现此异常的其他人提供的注释:两个函数必须具有相同的名称。按以下方式命名方法将导致异常:@propertydef x(self): pass@x.setterdef x_setter(self, value): pass而是给这两种方法取相同的名称@propertydef x(self): pass@x.setterdef x(self, value): pass同样重要的是要注意声明的顺序很重要。必须先在文件中的setter之前定义getter,否则您将获得NameError: name 'x' is not defined

交互式爱情

我想补充一点,当__init__基于此答案从您的类的方法调用设置器时,需要特别注意 :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 heret = testDec(17)print t.x Output:We are in __init__called settercalled getter17
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python