为什么下面的Python代码中__getattr__会触发__setattr__?

问题描述 投票:0回答:1
class D:
    def __init__(self):
        self._attr = 1
        self._attr2 = 2

    def __getattr__(self, name):
        if name == 'data':
            return (self._attr, self._attr2)

    def __setattr__(self, name, value):
        print('__setattr__')
        if name == 'data':
            self._attr, self._attr2 = value
        else:            
            super().__setattr__(name, value)

d = D()
print(d.data)  
#OUTPUT:
#__setattr__
#__setattr__
#(1,2)

出于某种原因,行

return (self._attr, self._attr2)
表现为对
self._attr
self._attr2
的赋值,但为什么呢?

我查阅了 Google 和 Gemini、Mark Lutz 的书,但无法弄清楚。

python class properties setattr
1个回答
0
投票

它不是来自

print(d.data)
线。评论出来吧这是通过设置
__init__
中的属性来实现的。将
__setattr__
中的打印扩展到
print(f'__setattr__({name=}, {value=})')
以查看更多信息:

class D:
    def __init__(self):
        self._attr = 1
        self._attr2 = 2

    def __getattr__(self, name):
        if name == 'data':
            return (self._attr, self._attr2)

    def __setattr__(self, name, value):
        print(f'__setattr__({name=}, {value=})')
        if name == 'data':
            self._attr, self._attr2 = value
        else:            
            super().__setattr__(name, value)

d = D()
#print(d.data)

输出:

__setattr__(name='_attr', value=1)
__setattr__(name='_attr2', value=2)
© www.soinside.com 2019 - 2024. All rights reserved.