6

我只是在阅读帖子如何在 python 中通过 __dict__ 分配新的类属性?@bruno desthuilliers 有一条评论说:

不应该直接调用魔术方法——它们在这里是作为运算符或通用函数的实现。在这种情况下,惯用的解决方案是使用setattr(obj, name, value).

setattr 的情况似乎超出了他自己评论的范围:不是运算符,也不是泛型函数的真正实现。

有人可以解释评论吗?为什么我应该更喜欢一个而不是另一个?

在什么情况下最好使用obj.__setattr__(name, value)

4

1 回答 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)
于 2013-02-07T16:46:49.793 回答