Python 在子類中調用父類方法詳解(單繼承、多層繼承、多重繼承)


Python 在子類中調用父類方法詳解(單繼承、多層繼承、多重繼承)

 

by:授客 QQ1033553122

 

 

測試環境:

win7 64

Python版本:Python 3.3.5

 

 

代碼實踐:

1、在子類中通過“類名”調用父類的方法

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        FatherA.__init__(self) # 在子類中調用父類的方法:父類名.方法名稱(參數)

 

if __name__ == '__main__':

    b = SubClassB()

   

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass B

init action in father class A

 

缺點:當一個子類的父類發生變化時(如類SubClassB的父類由FatherA變為FatherD時),必須遍歷整個類定義,把子類中所有的父類類名全部替換過來

 

2、在子類中通過“super”方法調用父類的方法

場景1、單層繼承

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in father class B')

        super().__init__() # 在子類中調用父類的方法:super().方法名稱(參數)

 

if __name__ == '__main__':

    b = SubClassB()

 

 

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super(SubClassB, self).__init__()  # 在子類中調用父類的方法:super(type, obj).方法名稱(參數)

 

       

if __name__ == '__main__':

    b = SubClassB()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in father class B

init action in father class A

說明:

1super(type, obj),其中obj必須是type類型、type子類類型的實例,否則會報錯:

TypeError: super(type, obj): obj must be an instance or subtype of type

 

2super().__init__()  效果等同 super(SubClassB, self). __init__()

 

場景2、多層繼承

實驗1

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

if __name__ == '__main__':

    b = SubClassC()

   

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

init action in subclass B

init action in father class A

 

對比實驗1-1

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super(SubClassB, self).__init__()

 

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

init action in father class A

>>> 

 

對比實驗1-2

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super(FatherA, FatherA).__init__(self) # 在子類中調用父類的方法:super(type, type).方法名稱(參數)

 

 

if __name__ == '__main__':

    b = SubClassC()

 

說明:可把 super(FatherA, FatherA).__init__(self) 換成:

super(FatherA, self).__init__()  

super(FatherA, SubClassB).__init__(self)

super(FatherA, SubClassC).__init__(self)

 

注意:以上這種情況,必須給__init__傳遞參數self,否則會報錯:

TypeError: __init__() missing 1 required positional argument: 'self'

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

>>> 

說明:super(type1, type2) type2必須和type1相同類型,或者其子類類型

 

實驗2

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

class SubClassD(SubClassC):

    def __init__(self):

        print('init action in subclass D')

        super().__init__()

 

if __name__ == '__main__':

    b = SubClassD()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass D

init action in subclass C

init action in subclass B

init action in father class A

 

對比實驗2-1

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

class SubClassD(SubClassC):

    def __init__(self):

        print('init action in subclass D')

        super(SubClassB, self).__init__()

 

if __name__ == '__main__':

    b = SubClassD()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass D

init action in father class A

>>> 

 

對比實驗2-2

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class SubClassB(FatherA):

    def __init__(self):

        print('init action in subclass B')

        super().__init__()

 

class SubClassC(SubClassB):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

class SubClassD(SubClassC):

    def __init__(self):

        print('init action in subclass D')

        super(SubClassC, self).__init__()

 

if __name__ == '__main__':

    b = SubClassD()

   

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass D

init action in subclass B

init action in father class A

 

通過對比實驗2-1 2-2,可看出super(type[,type2_or_obj]),type決定了super調用方法所在的父類--type的父類(如果有的話),即type決定了前往哪個父類調用指定的方法

 

 

場景3、多重繼承

實驗1

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        super(FatherB).__init__()

 

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

 

 

對比實驗1-1

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

class SubClassC(FatherB, FatherA):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

init action in father class B

>>> 

 

對比實驗1-2

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        super().__init__()

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

init action in father class A

>>> 

 

對比實驗1-3

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        super(FatherB).__init__()

 

if __name__ == '__main__':

    b = SubClassC()

>>> ================================ RESTART ================================

>>>

init action in subclass C

 

對比實驗1-4

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

    def testfn(self, arg):

        print('testfn in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

    def testfn(self):

        print('testfn in father class B')

       

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        super().testfn()

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

Traceback (most recent call last):

  File "C:/Users/Administrator/Desktop/1.py", line 21, in

    b = SubClassC()

  File "C:/Users/Administrator/Desktop/1.py", line 18, in __init__

    super().testfn()

TypeError: testfn() missing 1 required positional argument: 'arg'

>>> 

 

對比實驗1-5

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

    def testfn(self):

        print('testfn in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

    def testfn(self, arg):

        print('testfn in father class B')

       

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        super().testfn()

 

if __name__ == '__main__':

    b = SubClassC()

 

運行結果:

>>> ================================ RESTART ================================

>>>

init action in subclass C

testfn in father class A

 

說明:通過對比實驗1-11-21-31-41-5可以看出,子類水平方向上,繼承多個父類,以super().method(參數)方法調用父類的方法,如果不同父類中存在同名方法method(不管參數列表是否相同),則按繼承順序,選擇第一個父類中的方法。,如果想要調用多個方法咋辦?如下,通過類名調用

 

class FatherA:

    def __init__(self):

        print('init action in father class A')

 

class FatherB:

    def __init__(self):

        print('init action in father class B')

 

class SubClassC(FatherA, FatherB):

    def __init__(self):

        print('init action in subclass C')

        FatherA.__init__(self)

        FatherB.__init__(self)

 

if __name__ == '__main__':

    b = SubClassC()

   

>>> ================================ RESTART ================================

>>>

init action in subclass C

init action in father class A

init action in father class B

>>> 

 

 


免責聲明!

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



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