【问题标题】:setattr(object, name, value) vs object.__setattr__(name,value)setattr(object, name, value) vs object.__setattr__(name,value)
【发布时间】:2013-02-07 16:40:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python coding-style


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2012-08-04
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多