2011-06-10 31 views
2

我是一名python學習者,目前正在用"Bunch of Named Stuff" example here來攻擊可變數量字段的類。Python新式相關問題

class Bunch: 
    def __init__(self, **kwds): 
     self.__dict__.update(kwds) 

我也想寫此一等級__setattr__,以檢查輸入屬性名稱。但是,在python documentation說,

如果__setattr __()要分配給 實例屬性,它不應該 簡單地執行「self.name =價值」 - 這 會導致遞歸調用 本身。相反,它應該將 值插入實例 屬性的字典中,例如「self .__ dict __ [name] = value」。 對於新型類,而不是 訪問實例字典,它 應該調用基類的方法與 相同的名稱,例如, 「對象.__ SETATTR __(個體,名稱, 值)」。

在這種情況下,是否也應該使用object.__dict____init__功能,以取代self.__dict__

回答

1

不可以。您應該將您的班級定義爲class Bunch(object),但請繼續參考self.__dict__

您只需要在定義self.__setattr__方法時使用object.__setattr__方法來防止無限遞歸。 __dict__不是一種方法,而是對象本身的屬性,所以object.__dict__不起作用。

+0

約'對象.__ dict__'或多或少是明確的部分。然而,使用'baseclass .__ setattr__'的原因似乎是調用基類中的自定義重載。我對嗎? – 2011-06-10 11:41:02

+0

我不會說你在基類中調用自定義的。由於您正在重新定義「自定義重載」方法更新屬性的方式,因此您無法在其內部使用該方法。由於您試圖在不通過新的自定義機制的情況下更新屬性,因此您可以從基類中引用它。 – 2011-06-10 11:44:45

2

您可以使用

class Bunch: 
    def __init__(self, **kwds): 
     self.__dict__.update(kwds) 

    def __setattr__(self, name, value): 
     #do your verification stuff 
     self.__dict__[name] = value 

或新式類:

class Bunch(object): 
    def __init__(self, **kwds): 
     self.__dict__.update(kwds) 

    def __setattr__(self, name, value): 
     #do your verification stuff 
     super(Bunch, self).__setattr__(name, value)