setattr(object,name,value)vs object .__ setattr __(name,value)

时间:2013-02-07 16:40:47

标签: python coding-style

我刚刚阅读How can I assign a new class attribute via __dict__ in python?帖子,@bruno desthuilliers发表了一条评论说:

  

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

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

有人可以解释一下这个评论吗?为什么我更喜欢一个呢?

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

1 个答案:

答案 0 :(得分:15)

您应该始终使用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)