2010-06-18 119 views
6

我正在讀關於classes Python文檔和整個這一段,我不太肯定傳來:調用重寫的方法在派生類的基類

子類可以覆蓋方法類中的 。因爲 具有當 調用相同 對象的其它方法沒有特殊的特權的方法,基類的方法,其 調用在 相同基類中定義的另一種方法可能最終調用派生類的 方法 覆蓋它。 (對於C++程序員: 在Python所有的方法都是有效 虛擬)

實施例:

class A: 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from A" 

class B(A): 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from B" 

這是否意味着那個類的一個對象A obj = A()能以某種方式 「從B」 最終印刷?我正確閱讀這個嗎?如果這沒有意義,我很抱歉。我對python如何處理繼承和重寫有點困惑。謝謝!

回答

6

不,超類無法知道任何關於子類的內容。這意味着如果你實例化子類B,並且它繼承了方法foo(),並且重寫了方法bar(),那麼當你調用foo()時,這將在B中調用bar()定義,而不是在A中調用bar()。這不是什麼這位超級作家的意圖是 - 他預計他撥打電話bar()去自己的定義。

0

不,那是一個A任何對象將調用A.bar並打印「from A

哪個重載方法被調用取決於什麼對象,不是其他類可以從其類派生。把這個類看作一個餅乾,把這個對象當作cookie。

+0

擴大,字是_may_調用派生類的方法。 'obj = B()'_would_ print「from B」。 – 2010-06-18 23:49:49

0

不完全是:

class A: 
    def foo(self): 
     self.bar() 

    def foo2(self): 
     self.bar2() 

    def bar(self): 
     print "Bar A" 

    def bar2(self): 
     print "Bar2 A" 

class B(A): 
    def bar(self): 
     print "Bar B" 

objA = A() 
objA.foo() 
objA.foo2() 

objB = B() 
objB.foo() 
objB.foo2() 

輸出:

Bar A 
Bar2 A 
Bar B 
Bar2 A 
1

不,這意味着你,如果你有以下對象:

class B(A): 
    def bar(self): 
     print "from B" 

和你做

obj = B() 
obj.foo() 

那麼這將打印from Bfoo(),其在基類定義,來電bar(),這也是在基類中定義,但在派生類中重寫。

至少這是我讀的。

1
a = A() 
a.foo() 
b = B() 
b.foo() 
a.bar = b.bar 
a.foo() 

輸出:

from A 
from B 
from B 
0

我的回答並不一定矛盾已經發布了的,但它確實表明了一種通過調用基類來獲取基類「從B」打印方法來自繼承的類。基類繼承自繼承的self,因此仍然調用繼承的類方法。也許這是該段落所指的情況類型?

class A: 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print("from A") 

class B(A): 
    def foo(self): 
     super().foo() 

    def bar(self): 
     print("from B") 


A().foo() #prints "from A" 
B().foo() #prints "from B" but indirectly through the base class 
0
class A: 
    def f(self): 
     print 'a.f' 
     self.g() 

    def g(self): 
     print 'a.g' 

class B(A): 
    def g(self): 
     print 'b.g' 

b = B() 
b.f() 

# a.f 
# b.g 
相關問題