2013-10-24 25 views
1

例如,我有下面的代碼:的Python:調用父instancemethod

class Dog: 
    def bark(self): 
     print "WOOF" 

class BobyDog(Dog): 
    def bark(self): 
     print "WoOoOoF!!" 

otherDog= Dog() 
otherDog.bark() # WOOF 

boby = BobyDog() 
boby.bark() # WoOoOoF!! 

BobyDog是狗的孩子,已經overrided instancemethod 「汪汪」。

如何從類「BobyDog」的實例引用父方法「bark」?

換句話說:

class BobyDog(Dog): 
    def bark(self): 
     super.bark() # doesn't work 
     print "WoOoOoF!!" 

otherDog= Dog() 
otherDog.bark() # WOOF 

boby = BobyDog() 
boby.bark() 
# WOOF 
# WoOoOoF!! 

回答

3

您需要呼叫super()功能,並通過在當前類(BobyDog)和self

class BobyDog(Dog): 
    def bark(self): 
     super(BobyDog, self).bark() 
     print "WoOoOoF!!" 

更重要的是,你需要基地Dogobject,使其成爲一個新風格的類; super()不與老式類工作:

class Dog(object): 
    def bark(self): 
     print "WOOF" 

隨着這些變化,調用工作:

>>> class Dog(object): 
...  def bark(self): 
...   print "WOOF" 
... 
>>> class BobyDog(Dog): 
...  def bark(self): 
...   super(BobyDog, self).bark() 
...   print "WoOoOoF!!" 
... 
>>> BobyDog().bark() 
WOOF 
WoOoOoF!! 

在Python 3,老式類已被刪除;一切都是新式的,您可以省略super()中的類和self參數。

在老式類,調用原始方法的唯一方式是通過直接引用該未結合的方法上的父類,並在手動self傳遞:

class BobyDog(Dog): 
    def bark(self): 
     BobyDog.bark(self) 
     print "WoOoOoF!!"