[Python 基礎課程]繼承

在 Python 的面向對象編程(OOP)中,繼承(Inheritance) 是一種重要的機制,它允許一個類(稱為子類派生類)從另一個類(稱為父類基類超類)中繼承屬性和方法。

為什么需要繼承

考慮我們之前定義的 Person 類,現在我們想創建 StudentTeacher 類。它們都屬于“人”,所以都有姓名和年齡。

# 傳統的做法,沒有繼承
class Person:def __init__(self, name, age):self.name = nameself.age = agedef introduce(self):print(f"大家好,我叫 {self.name},今年 {self.age} 歲。")class Student:def __init__(self, name, age, student_id):# 代碼重復self.name = name# 代碼重復self.age = age self.student_id = student_iddef introduce(self):# 代碼重復print(f"大家好,我叫 {self.name},今年 {self.age} 歲。")print(f"我的學號是 {self.student_id}。")class Teacher:def __init__(self, name, age, subject):# 代碼重復self.name = name# 代碼重復self.age = age self.subject = subjectdef introduce(self):# 代碼重復print(f"大家好,我叫 {self.name},今年 {self.age} 歲。")print(f"我教 {self.subject}。")

你會發現 nameage 屬性以及 introduce 方法在 PersonStudentTeacher 類中重復出現了。這種代碼重復會導致:

  • 維護困難: 如果你需要修改“人”的共同行為(比如 introduce 方法),你必須在所有相關的類中都修改一遍。
  • 擴展性差: 每增加一個新的“人”的角色(比如 Employee),你都要重新編寫這些通用部分。

繼承就是為了解決這些問題: 它允許你定義一個通用的父類,把共同的屬性和方法放在父類中。然后,特定的子類可以繼承這些共同部分,并添加自己獨有的屬性和方法,或者修改(重寫)父類的行為。

繼承的基本用法

在 Python 中,子類在定義時,在類名后面的括號中指定它所繼承的父類。

class ChildClass(ParentClass, OtherParentClass):

示例:PersonStudentTeacher 的繼承關系

class Person:species = "人類" # 類屬性def __init__(self, name, age):self.name = nameself.age = ageprint(f"創建了一個 Person 對象: {self.name}")def introduce(self):print(f"大家好,我叫 {self.name},今年 {self.age} 歲,是 {self.species}。")def celebrate_birthday(self):self.age += 1print(f"{self.name} 過生日了,現在 {self.age} 歲了!")# Student 繼承自 Person
class Student(Person):def __init__(self, name, age, student_id):# 調用父類 (Person) 的構造器來初始化共同屬性super().__init__(name, age)# Student 獨有的屬性self.student_id = student_idprint(f"創建了一個 Student 對象: {self.name}, 學號: {self.student_id}")# 重寫 (Override) 父類的 introduce 方法def introduce(self):# 調用父類的 introduce 方法,重用其邏輯super().introduce()print(f"我的學號是 {self.student_id}。")def study(self):# Student 獨有的方法print(f"{self.name} 正在努力學習。")# Teacher 繼承自 Person
class Teacher(Person):def __init__(self, name, age, subject):# 調用父類 (Person) 的構造器super().__init__(name, age)# Teacher 獨有的屬性self.subject = subject print(f"創建了一個 Teacher 對象: {self.name}, 教授: {self.subject}")# 重寫父類的 introduce 方法def introduce(self):# 重用父類的 introduce 邏輯super().introduce()print(f"我教 {self.subject}。")def teach(self):# Teacher 獨有的方法print(f"{self.name} 正在教 {self.subject}。")# --- 演示與測試 ---
print("--- 創建對象 ---")
person = Person("王五", 40)
student = Student("小明", 18, "S12345")
teacher = Teacher("李老師", 35, "數學")print("\n--- 調用方法 ---")
person.introduce()
person.celebrate_birthday()student.introduce()
student.study()
# 繼承自 Person
student.celebrate_birthday()teacher.introduce()
teacher.teach()
# 繼承自 Person
teacher.celebrate_birthday() 

在 Python 中,子類默認會繼承父類的所有屬性和方法。如果你想讓父類的某個屬性不被繼承,可以通過使用 __ 前綴創建私有屬性。

class Parent:# 這是一個私有屬性,子類無法直接訪問__private_property = "這是父類的私有屬性"def __init__(self):# 這是一個私有實例屬性self.__private_instance_property = "這是父類的私有實例屬性"def get_private_property(self):# 通過方法返回私有屬性print(self.__private_property)print(self.__private_instance_property)class Child(Parent):def __init__(self):# 調用父類的構造函數super().__init__()print("嘗試從子類訪問父類的私有屬性:")try:# 嘗試訪問父類的私有屬性,會引發 AttributeErrorprint(self.__private_instance_property)except AttributeError as e:print(f"  錯誤:{e}")# 創建子類實例
child_obj = Child()
# 嘗試從外部訪問父類的私有屬性,也會引發 AttributeError
try:print(child_obj.__private_instance_property)
except AttributeError as e:print(f"  外部訪問錯誤:{e}")print("\n通過父類方法訪問:")
# 通過父類的方法可以成功訪問
child_obj.get_private_property()

super() 函數

在子類中,我們經常需要調用父類的方法,特別是父類的構造器 __init__()。這時,我們使用內置的 super() 函數。

  • super().__init__(...) 調用父類的 __init__ 方法來初始化父類定義的屬性。這是一種推薦的做法,確保父類的初始化邏輯得到執行。
  • super().method_name(...) 調用父類的其他方法。這在子類重寫了父類方法后,仍想在子類中執行父類的原始邏輯時非常有用。

:::warning
在 Python 3 中,super() 函數不帶參數就可以自動獲取當前類和實例,所以直接寫 super().__init__(...) 即可。在 Python 2 中,可能需要寫成 super(ChildClass, self).__init__(...)

:::

方法重寫

當子類中定義了一個與父類中同名的方法時,子類的方法會**覆蓋(override)**父類的方法。這意味著當你通過子類的實例調用該方法時,會執行子類中定義的方法。

在上面的示例中,StudentTeacher 類都重寫了 Person 類的 introduce 方法。重寫時,它們還通過 super().introduce() 調用了父類的 introduce 方法,以在添加自己特有信息的同時,保留父類的通用介紹。

多重繼承

Python 允許一個子類繼承多個父類,這被稱為多重繼承

語法如下:

class ChildClass(Parent1, Parent2, ...):

當一個子類繼承了多個父類,并且這些父類中有同名的方法或屬性時,Python 會遵循**方法解析順序(Method Resolution Order, MRO)**來查找方法或屬性。你可以通過 ChildClass.__mro__ 屬性或 help(ChildClass) 來查看 MRO。

:::warning
在 Python 中,MRO(Method Resolution Order,方法解析順序) 是一個決定多重繼承下方法或屬性查找順序的規則。它采用 C3 線性化算法 計算,確保類繼承關系的一致性和可預測性。

:::

class Flying:def fly(self):print("I can fly!")class Swimming:def swim(self):print("I can swim!")# 鴨子既能飛又能游
class Duck(Flying, Swimming):def quack(self):print("Quack! Quack!")duck = Duck()
duck.fly()
duck.swim()
duck.quack()print(Duck.__mro__) # 查看方法解析順序

:::warning
多重繼承雖然強大,但也可能導致復雜的繼承關系和“菱形繼承問題”(diamond problem)。在使用時需要謹慎,并理解 MRO。

:::

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95826.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT之設計器組件功能(8大類55個組件)

組件名稱 功能描述關鍵屬性1. Layouts(布局組件)(1) Vertical Layout(垂直布局)將子控件按垂直方向依次排列layoutSpacing:控件之間的間距layoutMargin:布局邊緣的邊距layoutStretch:設置各控件…

java中list的api詳細使用

在Java中,List是集合框架中最常用的接口之一,繼承自Collection,代表有序、可重復的元素集合(允許null元素)。其核心實現類有ArrayList(數組實現,隨機訪問高效)、LinkedList&#xff…

Azure AI Search 探索總結

Azure AI Search 原名 Azure Cognitive Service,是Azure中用來給AI項目構建知識庫的組件。知識庫本質和數據庫很像,但是內部的存儲結構和檢索算法不一樣。比如并不是知識庫的每一列都可以用來過濾、檢索或group by,而是要根據實際情況配置。A…

高效解決 pip install 報錯 SSLError: EOF occurred in violation of protocol

高效解決 pip install 報錯 SSLError: EOF occurred in violation of protocol 標簽: Python, pip, SSLError, Clash, 網絡代理, 問題解決 一、問題描述 在Python開發中,pip 是我們最親密的伙伴。然而,當你身處需要科學上網的環境&#xff0c…

CSS 核心知識點全解析:從基礎到實戰應用

大家好!今天這篇文章將系統總結 CSS 的核心知識點,從最基礎的樣式引入到復雜的選擇器應用,再到盒子模型、文本處理等實戰技巧,全程結合代碼示例,讓你輕松掌握 CSS 的精髓。一、CSS 是什么?為什么需要它&…

ClickHouse的學習與了解

什么是ClickHouse? ClickHouse是一個用于聯機分析(OLAP)的列式數據庫管理系統(DBMS)。 在傳統的行式數據庫系統中,數據按如下順序存儲:RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016/5/18 5:19#1903295…

安卓11 12系統修改定制化_____修改系統 解鎖system分區 去除data加密 自由刪減系統應用

在定制化系統中。修改系統分區 解鎖system。讓用戶可以自由刪減應用。這個在定制化服務中比較常見。對于此項修改服務。需要我們了解基礎的分區常識以及常用的幾種基礎修改步驟。 通過博文了解?????? 1??????-----修改rom 解鎖 system 分區有什么意義 2????…

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁”

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁” 在Android開發的世界里,加載PDF文件一直是個讓人又愛又恨的“小妖精”。愛它,因為PDF是文檔界的“萬能鑰匙”;恨它,因為原生Andr…

Three.js三大組件:場景(Scene)、相機(Camera)、渲染器(Renderer)

上一篇中我們學習了第一個Three.js場景"Hello World"。這一篇就來學習three.js的核心組件。 此圖來源(Three.js中文網) three.js的核心由三大組件構成:場景(Scene)、相機(Camera)和渲染器(Renderer)。下面我將詳細介紹這三大件的作…

AI幻覺終結之后:GPT-5開啟的“可靠性”新賽道與開發者生存指南

摘要: Sam Altman關于GPT-5將基本終結幻覺的宣告,不僅僅是一次技術升級,它標志著一個“萬物皆可AI,但萬事皆需驗證”的混亂時代的結束。本文將從一個全新的戰略視角出發,探討當“可靠性”取代“創造性”成為AI競賽的核…

ubuntu遠程桌面很卡怎么解決?

服務端方案 完成XRDP的性能優化配置: 1. 首先檢查當前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 編輯xrdp.ini文件,修改TCP發送緩沖區大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…

[Linux] Linux系統負載監控 Linux服務管理

目錄 Linux系統負載監控 系統負載介紹 查看系統負載 負載解讀 top 命令 Linux服務管理 systemd 介紹 系統啟動管理進程 基本概念 systemd 架構 unit 類型 查看 unit 列表信息 查看單個 unit 信息 控制系統服務 systemctl 命令 unit 配置文件 例:開發…

vector 手動實現 及遇到的各種細節問題

之前對vector的一些功能使用了一下 接下來手動實現一下vector vector的實現和string還是有不小區別的 有很多地方都有細節的問題不同于string的成員變量一個指針一個size一個capacity的成員變量 vector里面存的是三個迭代器iterator 這的迭代器其實就是模版T的指針 這樣就…

OpenStack Neutron中的L2 Agent與L3 Agent:新手友好指南

引言:云網絡的幕后英雄 在當今的云計算世界中,OpenStack作為開源云平臺的佼佼者,為成千上萬的企業提供了靈活、可擴展的基礎設施服務。而在OpenStack的眾多組件中,Neutron(網絡服務)扮演著至關重要的角色—…

【自用】JavaSE--特殊文件Properties與XML、日志技術

特殊文件概述使用特殊文件可以存儲多個有關系的數據,作為系統的配置信息屬性文件類似于鍵值對,一一對應存儲數據(比如用戶名與密碼)XML文件存儲多個用戶的多個屬性更適合,適合存儲更復雜的數據Properties注:這個屬性文件的后綴即使…

中本聰思想與Web3的困境:從理論到現實的跨越

一、中本聰思想的核心精髓中本聰通過比特幣白皮書提出的核心思想,可歸納為三大支柱:去中心化貨幣體系目標:擺脫中央機構控制,避免通貨膨脹和政治干預(如2008年金融危機暴露的中心化風險)。實現路徑&#xf…

Centos 用戶管理

一.創建用戶 在 root賬戶 或 sudo 權限下 1. 創建用戶 useradd xiaoyangzi2.為該用戶設置密碼或修改密碼 passwd xiaoyangzi3. 將用戶加入wheel用戶組 在 CentOS 中,屬于 wheel 組的用戶默認可以使用 sudo 權限。 查看所屬用戶組: groups xiaoyangzi將 xiaoyangzi 加…

C++枚舉算法習題

1. 3的倍數枚舉(基礎)題目:在之間有10和50多少個數是3的倍數?列舉這些數。 解析:枚舉10到50之間的數,判斷是否能被3整除。優化:計算第一個≥10的3的倍數(1234)&#xff0…

【SpringBoot系列-01】Spring Boot 啟動原理深度解析

【SpringBoot系列-01】Spring Boot 啟動原理深度解析 大家好!今天咱們來好好聊聊Spring Boot的啟動原理。估計不少人跟我一樣,剛開始用Spring Boot的時候覺得這玩意兒真神奇,一個main方法跑起來就啥都有了。但時間長了總會好奇:這…

windows環境下使用vscode以及相關插件搭建c/c++的編譯,調試環境

windows下使用vscode搭建c/c的編譯、運行、調試環境,需要注意的是生成的是xxx.exe可執行文件。另外使用的編譯器是mingw,也就是windows環境下的GNU。 我參考的網址是:https://zhuanlan.zhihu.com/p/1936443912806962622 文章分為2種環境搭建…