2014-03-04 65 views
2

我一直在閱讀關於覆蓋getattr和setattr的內容,如果我在構造函數中使用self .__ dict__ = self,我不知道是否需要重寫分配。python getattr和setattr with self .__ dict__

一旦我把課

a = OPT(foo='bar') 

a.foo和[「富」]的實例使用和不使用__getattr__和__setattr__申報工作。

有人可以解釋,如果我需要兩個。如果我這樣做,爲什麼?謝謝!

class OPT(dict): 
    __getattr__ = dict.__getitem__ 
    __setattr__ = dict.__setitem__ 

    def __init__(self, *args, **kwargs): 
     super(OPT, self).__init__(*args, **kwargs) 
     self.__dict__ = self 
+0

設置'self .__ dict__ = self'可能不是一個好主意。你想用這個代碼來完成什麼? – BrenBarn

+0

我正在以類似於字典的形式訪問該類。所以我可以做['bar']或a.bar。像[這篇文章](http://stackoverflow.com/questions/2641484/class-dict-self-init-args) – Ptrkcon

+2

問題是,如果有人做'a ['鍵'] = 2',他們會跺腳字典的'keys()'方法,等等。 – BrenBarn

回答

1

當您希望在類用戶獲取或設置屬性時需要額外執行某些操作時覆蓋getattr和setattr。例如:

1)當用戶操作無效屬性時,您可能會避免引發異常,因此您只需爲未知屬性返回None即可。 2)屬性操作實際上是被轉發/委託的,所以有效的屬性事先並不知道,例如,一個表示數據庫行的類,用戶將列作爲屬性進行操作。我需要運行時檢查給定的屬性名稱是否與列名匹配,也許我想原諒大寫/小寫的差異等。

另一件事,遏制有時是繼承的子類。您可以創建一個包含字典的類,而不是從字典繼承。

+0

如果我不打算做這樣的事情,我不需要重寫getattr和setattr?我總是可以在第一個例子中傳遞.get()的默認值。我不知道你的第二點會是什麼樣的例子。 – Ptrkcon

+0

爲了更加清晰,編輯第二個示例。 – epx

相關問題