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

为什么 __getattr__ catch 也是现有属性?

为什么 __getattr__ catch 也是现有属性?

元芳怎么了 2022-05-19 15:58:28
我创建了这个类来测试一些__getattr__特性:class Trace:    def __init__(self, val):        self.val = val    def __setattr__(self, attr, value):        print('set ' + attr)    def __getattr__(self, attr):        print('get ' + attr)然后我创建了一个实例a = Trace(10)print(a.val)a.val = 5print(a.val)但是,即使我只获取现有属性,这也是输出:set valget valNoneset valget valNone我正在使用 Python 3.7。
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

__getattr__仅在未正常找到属性但没有此类限制时才调用__setattr__(这就是为什么没有等效的__getattribute__for 它的原因)。您重写__setattr__为未实际设置实例属性,因此该属性始终丢失并且__getattr__无论如何都会被调用。(是的,它也适用__init__。)


删除__setattr__以快速查看您的预期行为,或添加其默认行为:


def __setattr__(self, attr, value):

    print('set ' + attr)

    super().__setattr__(attr, value)


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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