super().__init__()用法


優先閱讀:這個是我這個菜鳥自己理解的,誤導別人概不負責~哈哈哈哈哈哈哈

一、何時要使用super.__init__():

  我理解是,當需要繼承父類構造函數中的內容,且子類需要在父類的基礎上補充時,使用super().__init__()方法。

在這段代碼中,New_person這個類即需要用到父類中name和age,又需要新增sex這個參數。這時就需要用到super().__init__()來繼承父類中的name,和age。super().__init__()其實就是一個調用父類中__init__的函數。由於父類中的init有兩個參數,所以super().__init__()也要傳兩個參數。

通過子類中的__init__函數獲取到傳的參數,並傳給父類,如圖中的傳值關系。

當父類中的參數帶有默認值時,super().__init__()調用父類中__init__也可以不傳值(或傳self),由於傳值時self是可以省略的,所以寫或不寫結果是一樣的。self在子類中代表子類本身,把self傳到super().__init__()函數中,代表子類的__init__函數中的內容傳給了父類。

只不過是通過子類中重寫后傳到父類中的。既然已經在子類中重寫了self.name 、self.age、self.sex,那再調用super().__init__()函數就是多此一舉了。即使把super().__init__()這句代碼刪掉也是沒有影響的。

總之super().__init__()是為了繼承父類中的__init__,繼承后如果再子類中又重寫那我覺得就是白繼承了。。。

源碼在此,可以自己修改感受一下:

class Person():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def name1(self,name):          #定義方法名時不要和變量名一樣,否則在調用的時候可能會報錯。
        print('方法中名字 %s'%name)
        print('類中的名字 %s'%self.name)
    def age1(self,age):
        print('方法中的年齡 %s' %age)
        print('類中的年齡 %s' %self.age)
class New_person(Person):
    def __init__(self,new_name,new_age,sex):
        super().__init__(new_name,new_age)
        self.sex=sex
    def diaoyong(self,name,age):
        self.name1(name)
        self.age1(age)
    def sex1(self,sex):
        print('方法中的性別 %s' %sex)
        print('類中的性別 %s' %self.age)
new_p=New_person('小花','20','')
new_p.diaoyong('小米','15')
new_p.sex1('')
# new_p.name1('xiaohua')

 PS:還有就是,如果super().__init__()中,獲取了子類中傳的值,繼承了父類。但是子類的__init__方法中,又把數據重寫了,那再調用的時候,還是優先調用子類本身的值,如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM