根據Python的2.7.12文檔:爲什麼只在新樣式類中偏愛object .__ setattr __(self,name,value)?
如果
__setattr__()
想分配給一個實例屬性,它應該 不能簡單地執行self.name = value
- 這會導致遞歸調用 本身。相反,它應該將值插入實例屬性的詞典 中,例如self.__dict__[name] = value
。 對於 新樣式類,而不是訪問實例字典,它應該調用具有相同名稱的基類方法,例如,object.__setattr__(self, name, value)
。
但是,下面的代碼工作正如人們所預料:
class Class(object):
def __setattr__(self, name, val):
self.__dict__[name] = val;
c = Class()
c.val = 42
print c.val
我知道super(Class, obj).__setattr__(name, value)
可以確保所有基類的__setattr__
方法被調用,但經典的類還可以從基礎類繼承。那麼爲什麼只推薦新的風格類?
或者,另一方面,爲什麼不推薦經典課程?
*那麼爲什麼只推薦用於新樣式類?*調用'__setattr__'而不是直接在實例字典上操作允許超類對發生的事情進行「監督」。將這種方法看作是新風格類別的優勢。它可能會被推薦用於所有類,但不能繼承*的舊式類沒有可調用'__setattr__'方法的超類。 – jedwards
@jedwards是的,因爲經典類沒有'classobj .__ setattr__',只有'object .__ setattr__'用於新樣式類。 –
你完全正確。我想說的是,我認爲你把加粗的那句話,沒有這麼多來自字典,直接使用實例挫折(如你表明,它工作在很多情況下完全正常,並作爲馬亭顯示,存在這樣的情況也不會),但更多的鼓勵*使用'__setattr__',這允許超類有些監督和使用諸如描述符之類的新特徵。對不起,如果我不清楚:) – jedwards