setattr(object, name, value) 与 object.__setattr__(name, value) 有何区别?

6 投票
1 回答
1428 浏览
提问于 2025-04-17 15:07

我刚刚在看一篇帖子,标题是“如何通过 __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)

撰写回答