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 的书,但无法弄清楚。
它不是来自
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)