一文深入了解Python中的繼承知識點
1 類繼承
Python 是面向?qū)ο蟮木幊陶Z言,因此支持面向?qū)ο蟮娜筇匦灾唬豪^承。
繼承是代碼重用的一種途徑,Python 中的繼承就像現(xiàn)實生活中的繼承一樣,子類可以順利繼承父類的屬性或方法。允許我們再對象之間創(chuàng)建復(fù)雜且類似現(xiàn)實世界的關(guān)系。
繼承父類的類稱為子類、派生類或擴展類,被繼承的類被稱為父類、超類或基類。
在之前的文中學到 Python 中的構(gòu)造函數(shù),并且每一個類都有一個構(gòu)造函數(shù) __init__()
,在 Python 中任何類都是繼承于最大的基類 Object
,如下所示:
Python 3.10.4 (v3.10.4:9d38120e33, Mar 23 2022, 17:29:05) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> dir(object) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] >>>
Python 中繼承類的語法如下:
class SubClass(SuperClass):
1.1 繼承的簡單例子
先來看一個簡單的繼承例子,假如有一個 Car
類繼承于更通用的類 Vehicle
,然后也可以定義一個 Motorcyle
類,繼承圖如下:
Python 代碼實現(xiàn)如上繼承關(guān)系,如下:
class Vehicle: def __init__(self, started = False, speed = 0): self.started = started self.speed = speed def start(self): self.started = True print("啟動,皮皮蝦我們走") def stop(self): self.speed = 0 def increaseSpeed(self, delta): if self.started: self.speed += delta print("Vroooooom!") else: print("還沒啟動呢!") class Car(Vehicle): trunk_open = False def open_trunk(self): self.trunk_open = True def close_trunk(self): self.trunk_open = False
我們的汽車繼承了車輛類的所有方法和變量,但添加了一個額外的變量和兩個方法來操作后備箱。
有時你想覆蓋繼承的 __init__()
函數(shù)。為了演示,我們可以創(chuàng)建一個摩托車類。大多數(shù)摩托車都有一個中心支架。我們將在初始化時添加輸出或輸入的功能:
class Motorcycle(Vehicle): def __init__(self, center_start_out = False): self.center_start_out = center_start_out super().__init__() def start(self): print("Sorry, out of fuel!")
需要注意的是,在重寫構(gòu)造函數(shù)時,我們繼承的父類的構(gòu)造函數(shù)不會被改變。如果想要更改這個功能,需要自己調(diào)用它。這是通過 super()
函數(shù)完成返回父類的引用,然后才能調(diào)用父類的構(gòu)造函數(shù)。
class Vehicle: def __init__(self, started = False, speed = 0): self.started = started self.speed = speed def start(self): self.started = True print("啟動,皮皮蝦我們走") def stop(self): self.speed = 0 def increaseSpeed(self, delta): if self.started: self.speed += delta print("Vroooooom!") else: print("還沒啟動呢!") class Car(Vehicle): trunk_open = False def open_trunk(self): self.trunk_open = True def close_trunk(self): self.trunk_open = False class Motorcycle(Vehicle): def __init__(self, center_start_out = False): self.center_start_out = center_start_out super().__init__() V = Vehicle() C = Car() M = Motorcycle() print(type(V)) print(type(C)) print(type(M)) print("摩托車是交通工具的實例嗎?",isinstance(M, Vehicle))
super()
函數(shù)返回一個代表父類的臨時對象。這用于訪問父類的方法和屬性。在 super()
函數(shù)的幫助下,我們還可以訪問被覆蓋的方法。
運行上面代碼的結(jié)果如下:
2 繼承的類型
2.1 單繼承
單繼承就是一個子類只有一個基類的繼承方式,顯示圖如下:
最基本的例子如下:
class Animal: print("我是動物") class Cat(Animal): print("我是貓")
2.2 多繼承
多繼承就是一個子類可以繼承多個父類的繼承方式,相對于單繼承來說,多繼承更復(fù)雜,容易造成菱形繼承問題,即兩個父類同時繼承了一個基類,而子類會包含多個父類的內(nèi)容,產(chǎn)生代碼歧義。
多繼承結(jié)構(gòu)圖:
語法結(jié)構(gòu)如下:
class A: def __init__(self, name): self.name = name def introduction(self): print("我叫", self.name) class B: def __init__(self, age): self.age = age def introduction(self): print("我今年 %d 歲了" % self.age) class C(A, B): pass c = C(18) c.introduction()
運行代碼:
我叫 18
從上面的執(zhí)行結(jié)果來看,本來想介紹年齡,最后卻輸出了“我叫 18”,這種現(xiàn)象就是繼承順序?qū)е碌模?A 在類 B 的前面,所以對于同名的屬性和方法子類都會調(diào)用 類 A 的。
2.3 多級繼承
當一個類繼承一個子類時,它被稱為多級繼承。繼承子類的類被稱為孫子類。多級繼承會導(dǎo)致孫子和子關(guān)系。孫子類可以訪問子類和父類的屬性。
多級繼承結(jié)構(gòu)圖:
class Parent: str1 = "Python" class Child(Parent): str2 = " is the best programming?" class GrandChild(Child): def get_str(self): print(self.str1 + self.str2) person = GrandChild() person.get_str()
運行結(jié)果:
Python is the best programming?
在上面的代碼示例中,GrandChild 是 Child 的一個子類,而 Child 是 Parent 的一個子類。因此,GrandChild 可以訪問父類和子類的屬性。
2.4 分層繼承
當多個類繼承同一個類時,稱為分層繼承。結(jié)構(gòu)圖如下:
代碼如下:
class SuperClass: x = 2022 class SubClass1(SuperClass): pass class SubClass2(SuperClass): pass class SubClass3(SuperClass): pass a = SubClass1() b = SubClass2() c = SubClass3() print(a.x, b.x, c.x)
運行結(jié)果:
(2022, 2022, 2022)
2.5 Python中的混合繼承
一種以上繼承類型的組合稱為混合繼承。結(jié)構(gòu)圖如下:
代碼例子如下:
class X: num = 2023 class A(X): pass class B(A): pass class C(A): pass class D(B, C): pass ob = D() print(D.num)
在上面的代碼示例中,我們結(jié)合了多級繼承、多重繼承和分層繼承,因此創(chuàng)建了混合繼承。輸出結(jié)果:
2023
3 總結(jié)
繼承允許我們定義繼承另一個類的所有方法和屬性的類。父類是繼承的類,也稱為基類、派生類。子類是從另一個類繼承的類,也稱為派生類。
本文介紹了 Python 的繼承方法和繼承的 5 種分類,并在簡單的例子中實踐了各種繼承的方式。但繼承的實際用法可不會像本文這樣簡單,今后介紹更多相關(guān)的知識。
到此這篇關(guān)于一文深入了解Python中的繼承知識點的文章就介紹到這了,更多相關(guān)Python 繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python報錯:TypeError:?‘xxx‘?object?is?not?subscriptable解決
這篇文章主要給大家介紹了關(guān)于Python報錯:TypeError:?‘xxx‘?object?is?not?subscriptable的解決辦法,TypeError是Python中的一種錯誤,表示操作或函數(shù)應(yīng)用于不合適類型的對象時發(fā)生,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2024-08-08Python使用scrapy采集時偽裝成HTTP/1.1的方法
這篇文章主要介紹了Python使用scrapy采集時偽裝成HTTP/1.1的方法,實例分析了scrapy采集的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04Python 如何創(chuàng)建一個簡單的REST接口
這篇文章主要介紹了Python 如何創(chuàng)建一個簡單的REST接口,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07Python轉(zhuǎn)json時出現(xiàn)中文亂碼的問題及解決
這篇文章主要介紹了Python轉(zhuǎn)json時出現(xiàn)中文亂碼的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02