2011-06-14 38 views
8

在下面的示例中,B.Go()方法中的最後2行都從class A調用Go()方法。它們在功能上是否相同?使用super()的唯一好處是我不必知道繼承的類名稱?Python的super()函數

class A(object): 
    def Go(self): 
     print "Calling A.Go()" 

class B(A): 
    def Go(self): 
     super(B, self).Go() 
     A.Go(self) 

inst = B() 
inst.Go() 
+3

你可能是指'A.Go(self)'而不是'A().Go()'。 – 2011-06-14 23:57:27

+1

@Thomas - 更新,謝謝。 – tMC 2011-06-15 00:04:04

回答

14

不,super()做某事A.Go不能直接調用。 super(B, self).Go()以方法解析順序調用下一個方法。它調用的方法本來被稱爲B根本沒有實現該方法。在直接線性繼承中,這總是A,所以沒有真正的區別(除了重複的類)。但是,在多重繼承的情況下,普通方法解析順序中的下一個類不一定是當前的直接基類類。請參閱Guido's original explanation這些功能的鑽石繼承說明。

2

不完全是。通過使用super,只需要實例化B,就有一個實例。第二行創建A的新實例,可能在初始化器中有副作用,並且不共享其他實例屬性或狀態(B實例inst)。

+1

這是不正確的。 'A()。Go()'會做你所描述的。 'A.Go(self)'是獲得類A上的Go方法,但不綁定到實例,然後將self(本例中爲B的一個實例)作爲實例參數傳遞給該方法。 – Ben 2011-06-15 00:41:21

+2

啊,對不起,我剛剛意識到原始描述已被編輯。 – Ben 2011-06-15 00:47:32

1

它們完全不同。調用A()。Go()可以構造一個全新的對象,它不會與創建的實例共享任何屬性。

你的例子太簡單,你需要有一個狀態展現真實不同的行爲

4

除了Thomas Wouters提供的優秀答案之外,我還補充說super()是非常有用的,因爲它是一種計算間接指標。使用super()的一個關鍵的好處是,您不必通過名稱來指定委託類,這可以在稍後更改基類。 Raymond Hettinger在這方面有一個很棒的帖子:Python's super() considered super!

+1

+1爲Raymond的文章參考。 – 2011-06-15 02:23:45

相關問題