__setattr__和__dict__之间的区别
如果我想为实例设置一个属性?
我可以使用__setattr__(key, value) 或 self.__dict__[key]=value
我想知道如何__setattr__工作,如果__setattr__只是设置 k,v in __dict__,两种方式有什么区别?setattr 存在的意义是什么?
回答
while__dict__是一个包含所有内部变量的内部字典,__setattr__实际上是一个在您尝试设置属性时始终会调用的方法,因此,您可以拦截这些操作并据此采取行动。
示例代码可以帮助您了解差异:
class Foo:
def __setattr__(self, key, value):
print(f'Setting {key} to {value}')
self.__dict__[key] = value
f = Foo()
f.__dict__['test'] = 1
f.__setattr__('test', 2)
f.test = 3
输出将是:
Setting test to 2
Setting test to 3
而原因是,通过访问__dict__,您是直接访问内部对象字典,而__setattr__跳过了该方法。