setattr(object, name, value) 与 object.__setattr__(name, value) 有何区别?
我刚刚在看一篇帖子,标题是“如何通过 __dict__ 在 Python 中分配新的类属性?”,里面有位叫 @bruno desthuilliers 的评论说:
不应该直接调用魔法方法——它们是用来实现操作符或通用函数的。在这种情况下,推荐的做法是使用
setattr(obj, name, value)
。
但是,评论中提到的 setattr 似乎和他自己说的内容不太相关:它既不是操作符,也不完全是通用函数的实现。
有人能解释一下这条评论吗?为什么我应该选择其中一个而不是另一个?
在什么情况下使用 obj.__setattr__(name, value)
更好呢?
1 个回答
16
你应该总是使用 setattr()
,评论者说得很对。
并不是所有类型都实现了 __setattr__
,但只要这个类型允许设置属性,setattr()
就能正常工作。
双下划线的方法是一些特殊的钩子,用来让你自定义的类可以实现特定的行为。如果这些钩子存在,Python 的API会使用它们;如果没有,就会退回到默认的行为。如果你绕过了这些API,你就得自己在代码中实现默认行为,这样会增加你的工作量。
你只需要在实现子类的时候直接调用 __setattr__
,而且最好通过 super()
来调用:
def Foo(Bar):
def __setattr__(self, attr, value):
# do something with attr and value
super(Foo, self).__setattr__(attr, value)