它不是来自
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)
注意,您也可以实现相同的行为
data
作为一个属性,并具有更清晰的代码:
class D:
def __init__(self):
self._attr = 1
self._attr2 = 2
@property
def data(self):
return (self._attr, self._attr2)
@data.setter
def data(self, value):
self._attr, self._attr2 = value
d = D()
print(d.data)
d.data = 4,5
print(d.data)
输出
(1, 2)
(4, 5)