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

我创建了这个类来测试一些__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 = 5

print(a.val)

但是,即使我只获取现有属性,这也是输出:


set val

get val

None

set val

get val

None

我正在使用 Python 3.7。


元芳怎么了
浏览 125回答 1
1回答

MMTTMM

__getattr__仅在未正常找到属性但没有此类限制时才调用__setattr__(这就是为什么没有等效的__getattribute__for 它的原因)。您重写__setattr__为未实际设置实例属性,因此该属性始终丢失并且__getattr__无论如何都会被调用。(是的,它也适用__init__。)删除__setattr__以快速查看您的预期行为,或添加其默认行为:def __setattr__(self, attr, value):    print('set ' + attr)    super().__setattr__(attr, value)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python