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  
Exit mobile version