为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

忽然笑 2019-12-20 11:13:14
因此,我正在使用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 testDecfrom testDec import testDec>>> t = testDec()t = testDec()>>> t.xt.xcalled getterTraceback (most recent call last):  File "<stdin>", line 1, in <module>  File "testDec.py", line 18, in x    return self._xAttributeError: testDec instance has no attribute '_x'>>> t.x = 5t.x = 5>>> t.xt.x5显然,第一个调用按预期工作,因为我调用了getter,并且没有默认值,并且失败。好,很好,我了解。但是,对assign的调用t.x = 5似乎会创建一个新属性x,而现在getter无效!我想念什么?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

只是为那些偶然发现此异常的其他人提供的注释:两个函数必须具有相同的名称。按以下方式命名方法将导致异常:


@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


查看完整回答
反对 回复 2019-12-20
?
交互式爱情

TA贡献1712条经验 获得超3个赞

我想补充一点,当__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 here


t = testDec(17)

print t.x 


Output:

We are in __init__

called setter

called getter

17


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 531 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号