2017-10-17 83 views
4
class Foo(object): 
    def whee(self): 
     return 77 

class Bar(Foo): 
    def whee(self): 
     return super(Bar, self).whee() + 1 

class Baz(Foo): 
    def whee(self): 
     return super(self.__class__, self).whee() + 1 

BarBaz返回whee()相同的結果。我習慣於Bar的語法。我有什麼理由不應該使用Baz的語法嗎?在Python中正確使用super - 我應該明確引用類名嗎?

+2

從來沒有過'自.__ class__'到'super'。如果真是那麼簡單,那麼「超級」從不會首先要求這個論點。 – user2357112

回答

7

是否有任何理由我不應該使用Baz中的語法?

是的,有一個原因,你不應該使用該語法。如果您從Baz繼承,則super()調用將解析回Baz.whee(),您將陷入無限循環。這也適用於語法super(type(self), self).whee()

(好吧,其實你會吹的遞歸限制和錯誤的。但不管怎樣這是一個問題。)

+0

哦。哎呀,這是有道理的。 –

+1

...所以我想這意味着類方法沒有任何方式訪問它們聲明的類,除非您明確引用該類? –

+3

@JasonS:是的,這就是爲什麼Python 3必須添加一個「secret」__class__'局部變量來保存該信息。這就是zero-args'super()'的工作原理。 – Kevin