2010-10-07 32 views
4

Python新手問題。我有一個繼承自幾個類的類,並且一些專業化類重寫了基類中的一些方法。在某些情況下,我想調用非特殊化的方法。這可能嗎?如果是這樣,語法是什麼?Python:如何區分繼承的方法

class Base(object): 
    def Foo(self): 
     print "Base.Foo" 

    def Bar(self): 
     self.Foo() # Can I force this to call Base.Foo even if Foo has an override? 


class Mixin(object): 
    def Foo(self): 
     print "Mixin.Foo" 


class Composite(Mixin, Base): 
    pass 


x = Composite() 
x.Foo() # executes Mixin.Foo, perfect 
x.Bar() # indirectly executes Mixin.Foo, but I want Base.Foo 
+1

'foo' /'bar'?爲什麼那麼認真; Python使用'spam' /'egg'。 – 2010-10-07 15:11:51

回答

6

可以專門撥打電話要使用語法

Base.Foo(self) 

你的情況:

class Base(object): 
    # snipped 

    def Bar(self): 
     Base.Foo(self) # this will now call Base.Foo regardless of if a subclass 
         # overrides it 

# snipped 


x = Composite() 
x.Foo() # executes Mixin.Foo, perfect 
x.Bar() # prints "Base.Foo" 

這工作因爲Python執行到窗體的綁定方法的調用

instance.method(argument) 

,好像他們是一個調用未綁定方法

Class.method(instance, argument) 

因此使得以該方式調用給你想要的結果。在方法內部,self只是方法被調用的實例,即隱含的第一個參數(作爲參數明確指定)

但請注意,如果子類覆蓋Bar,那麼沒有什麼(好的)可以有效地做到AFAIK。但這只是在Python中工作的方式。

+0

謝謝!我想我知道所有這些,但是我在腦海中過度複雜。 – 2010-10-07 15:17:04