2013-02-07 125 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偉大的答案 –