2011-05-25 74 views
8

這是超級()的合法使用嗎?使用超級()而不是直接父級

class A(object): 
    def method(self, arg): 
     pass 

class B(A): 
    def method(self, arg): 
     super(B,self).method(arg) 

class C(B): 
    def method(self, arg): 
     super(B,self).method(arg) 

謝謝。

+1

看起來對我有效。你也許也想讀這個:http://stackoverflow.com/questions/576169/understanding-python-super – blueberryfields 2011-05-25 20:44:37

回答

7

它會工作,但它可能會混淆嘗試閱讀你的代碼的人(包括你,除非你特別記得)。不要忘了,如果你想從一個特定的父類調用一個方法,你可以這樣做:

A.method(self, arg) 
+0

我假設,如果沒有涉及多重繼承,'A.method(self,arg)'和'super(B,self).method(arg)'是等價的(減去潛在的用戶混淆)? – upperBound 2011-05-25 20:55:15

+0

@upperBound:是的。雖然顯然在這兩種情況下,您需要了解如果您更改其繼承關係會發生什麼情況。 – 2011-05-25 20:59:53

2

那麼,「法律」是這裏的可疑項。代碼將最終調用A.method,因爲從搜索中排除了給super的類型。我會認爲這種用法至少可以說是因爲它會跳過繼承層次結構中的一個成員(看起來很危險),這與我期望作爲開發人員所期望的不一致。由於已經鼓勵super的用戶保持一致性,所以我建議不要這樣做。

+0

我同意。你怎麼看待使用'A.method(self,arg)',因爲這也會跨越層次結構? – upperBound 2011-05-25 21:08:07