2012-04-08 67 views
1

我在WTForms工作與繼承。 我隔壁班:錯誤的類繼承與自我.__ class__?

class MyForm(WTForms): 
    ... 
    def process(self, formdata=formdata, obj=None): 
     super(self.__class__, self).process(formdata=formdata, obj=obj) 

而我卻錯誤(並非總是如此,但在某些情況下,類似的形式 - 這是更奇怪):

Maximum recursion depth have been exceeded

但是當我改爲self.__class__MyForm一切都OK!

我不明白它......因爲我知道它們必須是同義詞。怎麼了?

回答

5

它們不是同義詞。 self可以是繼承的類別的任何對象MyForm。 Python並沒有默默地創建一個新的超類對象來調用繼承的方法,它只是傳遞相同的對象(這樣做會破壞多態性並且沒有任何用處)。而顯然這個對象實際上是一個實例的類,而不是某個超類(你不希望MyShinyThing().__class__產生object,對不對?)。如果__class__根據訪問位置而改變,那將非常令人驚訝,非慣用且無用。這只是多態。

而作爲第一個參數super是一個指標,其中在MRO的supermethod搜索應繼續(非正式:您當前所在),通過self.__class__總是在任何類self是(立即)超開始回一個實例。假設在類層次結構中的其他地方調用了合適的super,這最終會讓您回到MyForm.process,並且我們已經有了無限循環。

+0

優秀的解釋。 – 2012-04-08 08:44:48