1. 程式人生 > >python繼承和重寫init方法--例項

python繼承和重寫init方法--例項

一、 子類不重寫__init__ , 例項化子類時,會自動呼叫父類定義的__init__

二、 子類重寫了__init__時,例項化子類,就不會呼叫父類已經定義的__init__

三、為了能使用或擴充套件父類的行為,要顯示呼叫父類的__init__方法,有以下兩種呼叫方式。

1. 呼叫未繫結的父類構造方法

class FooParent(object):  #父類
    def __init__(self):  
        self.parent = 'I\'m the parent.'  
        print 'Parent'  
      
    def bar(self,message):  
        print message, 'from Parent'  
          
class FooChild(FooParent):  #子類
    def __init__(self):  
        FooParent.__init__(self)  #呼叫未繫結的超類構造方法【必須顯式呼叫父類的構造方法,否則不會執行父類構造方法,這個跟Java不一樣】
        print 'Child'  
          
    def bar(self,message):  
        FooParent.bar(self,message)  
        print 'Child bar function.'  
        print self.parent  
          
if __name__=='__main__':  
    fooChild = FooChild()  
    fooChild.bar('HelloWorld')  
 
2. super繼承:

使用super需要繼承object物件,屬於新式類。super函式會返回一個super物件 ,這個物件負責進行方法解析,解析過程中會自動查詢所有父類以及父類的父類。super函式比在超類中直接呼叫未繫結方法更加直觀,但是最大的優點是如果子類繼承了多個父類,它只需要使用一次super函式就可以。而如果沒有這個需求,直接使用FooParent.__init__(self)更加直觀.

class FooParent(object):  
    def __init__(self):  
        self.parent = 'I\'m the parent.'  
        print 'Parent'  
      
    def bar(self,message):  
        print message,'from Parent'  
  
class FooChild(FooParent):  
    def __init__(self):  
        super(FooChild,self).__init__()  #使用super函式
        print 'Child'  
          
    def bar(self,message):  
        super(FooChild, self).bar(message) #super 呼叫例項方法 
        print 'Child bar fuction'  
        print self.parent  
  
if __name__ == '__main__':  
    fooChild = FooChild()  
    fooChild.bar('HelloWorld')