2013-02-07 127 views
6

我只是读后How can I assign a new class attribute via __dict__ in python?而且从@bruno desthuilliers一个评论说:SETATTR(对象名称,值)对对象.__ SETATTR __(名称,值)

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

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

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

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

回答

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) 
+0

感谢@Martijn伟大的答案 –