Python類的繼承實例
- 2019 年 10 月 25 日
- 筆記
類的繼承可以看成對類的屬性和方法的重用,能夠大大的減少代碼量,繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,也就是說在python中支持一個兒子繼承多個爹。
通過繼承創建的新類為子類或者派生類。
被繼承的類稱為基類、父類或超類
1、子類會繼承父類所有的功能屬性和方法,並且子類能夠擁有自己的屬性和方法;對原來的父類不會產生任何影響。單繼承中只有一個父類,而多繼承中有多個父類
2、調用屬性和方法時,優先調用子類的,子類沒有再去父類調用,當子類的屬性和方法與父類的屬性和方法名稱重複時,以子類的屬性和方法為準
3、多重繼承時,有相同名稱的屬性和方法時,會優先繼承寫在前面的父類的重名屬性和方法,前面沒有再去找下個父類,父類也沒有,找爺爺類
4、多重繼承時,若子類有構造函數,調用子類構造函數,若子類沒有,會調用寫在前面父類的構造函數,再找後面的父類,最後找爺類
5、調用父類,若有構造函數,在實例化子類時就要傳相應多的參數,需要多傳參數時,就需要重構父類
6、如果在子類需要父類的構造方法就需要顯式地調用父類的構造方法,或者不重寫父類的構造方法。子類不重寫 __init__,實例化子類時,會自動調用父類定義的 __init__;如果重寫了__init__ 時,實例化子類,就不會調用父類已經定義的 __init__,要繼承父類的構造方法,可以使用 super 關鍵字重寫父類構造函數
實驗證明: 1、實例化時,優先調用本類和繼承類的構造函數 2、調用屬性和方法時,優先調用子類的,子類沒有再去父類調用,當子類的屬性和方法與父類的屬性和方法名稱重複時,以子類的屬性和方法為準 import requests,json class Person(object): name='Person類name' age='Person類的age' def __init__(self,name,age): self.name=name self.age=age print('這裡是Person類的構造方法') def eat(self): print('%s 在吃飯(Person類eat方法)'%self.name) def sleep(self): print('%s 在睡覺(Person類sleep方法)'%self.name) class Teacher(Person): name='Teacher類的name' def eat(self): print('%s 在吃飯(Teacher類eat方法)' %self.name) test=Teacher('橙子',11) test.eat() test.sleep() print(test.name) print(Teacher.age) "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這裡是Person類的構造方法 橙子 在吃飯(Teacher類eat方法) 橙子 在睡覺(Person類sleep方法) 橙子 Person類的age Process finished with exit code 0
實驗證明: 1、子類有構造函數,優先調用子類的構造函數 2、子類沒構造函數,找父類,調用父類構造函數 3、子類沒有構造函數,父類也沒有構造函數,找爺類,調用爺類構造函數 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): def __init__(self): print('這個是B類構造函數') pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(C,B): def __init__(self): print('這個是D類構造函數') pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是D類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): def __init__(self): print('這個是B類構造函數') pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是B類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是C類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): pass class C(A): pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是A類構造函數 Process finished with exit code 0 實驗證明: 1、子類有構造函數,優先調用子類的構造函數 2、子類沒構造函數,找父類,調用父類構造函數 3、子類沒有構造函數,父類也沒有構造函數,找爺類,調用爺類構造函數 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): def __init__(self): print('這個是B類構造函數') pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(C,B): def __init__(self): print('這個是D類構造函數') pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是D類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): def __init__(self): print('這個是B類構造函數') pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是B類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): pass class C(A): def __init__(self): print('這個是C類構造函數') pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是C類構造函數 Process finished with exit code 0 class A(object): def __init__(self): print('這個是A類構造函數') pass class B(A): pass class C(A): pass class D(B,C): pass test=D() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 這個是A類構造函數 Process finished with exit code 0
實驗證明: 如果在子類需要父類構造方法,不重寫父類的構造方法。實例化子類時,會自動調用父類定義的 __init__;如果重寫了__init__ 時,實例化子類,就不會調用父類已經定義的 __init__,要繼承父類的構造方法,可以使用 super 關鍵字重寫父類構造函數 class Father(object): def __init__(self, name): self.name = name print("父類構造函數name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name,age): super(Son, self).__init__(name)#重寫父類構造方法 self.age=age print("子類構造函數name:%s 年齡:%s"%(self.name,self.age)) def getName(self): print('子類方法') if __name__ == '__main__': son = Son('runoob',30) son.getName() "C:Program FilesPython35python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 父類構造函數name: runoob 子類構造函數name:runoob 年齡:30 子類方法 Process finished with exit code 0