[Python學習篇] Python面向對象——繼承

繼承是什么

繼承是面向對象編程(OOP)中的一個核心概念。繼承允許一個類(稱為子類或派生類)從另一個類(稱為父類或基類)繼承屬性和方法。這樣可以重用代碼,提高代碼的模塊化和可維護性。

  • 父類(基類):提供屬性和方法的類。
  • 子類(派生類):繼承父類的屬性和方法的類。

語法:

class 父類:
? ? # 父類的屬性和方法
? ? def __init__(self, 屬性1):
? ? ? ? self.屬性1 = 屬性1

? ? def 方法1(self):
? ? ? ? print("這是父類的方法")


class 子類(父類):
? ? # 子類的屬性和方法
? ? def __init__(self, 屬性1, 屬性2):
? ? ? ? super().__init__(屬性1)
? ? ? ? self.屬性2 = 屬性2

? ? def 方法2(self):
? ? ? ? print("這是子類的方法")
?

示例:

# 定義父類-動物
class Animal:def __init__(self, name):self.name = name# 定義一個空的方法,方法的具體實現由之類重寫def speak(self):pass# 定義一個普通方法,子類繼承該方法def eat(self):print(f"{self.name} 正在吃飯")# 定義子類-狗
class Dog(Animal):def speak(self):return f"{self.name} 汪汪叫!"# 定義子類-貓
class Cat(Animal):def speak(self):return f"{self.name} 喵喵叫!"# 創建對象并調用方法
dog = Dog("狗")
cat = Cat("貓")print(dog.speak())  # 輸出: 狗 汪汪叫!
print(cat.speak())  # 輸出: 貓 喵喵叫!dog.eat()  # 輸出: 狗 正在吃飯
cat.eat()  # 輸出: 貓 正在吃飯

繼承的優點

  • 代碼重用:子類可以重用父類中的代碼,減少重復代碼。
  • 模塊化:通過繼承,可以將通用的功能放在父類中,實現代碼模塊化。
  • 可擴展性:可以在子類中添加新的功能,而不必修改父類的代碼。

多繼承

  • 單繼承指的是一個類只繼承一個父類。子類可以重用父類的屬性和方法。
  • 多繼承指的是一個類可以繼承多個父類,從而獲得所有父類的屬性和方法。這在某些情況下非常有用,但也可能導致復雜性增加,比如遇到方法解析順序(MRO)問題。
方法解析順序(MRO)

在多繼承中,方法解析順序(Method Resolution Order,MRO)決定了在類層次結構中搜索方法和屬性的順序。Python使用C3線性化算法來計算MRO。可以使用__mro__屬性或mro()方法來查看類的MRO。

示例:

在這個例子中,D類繼承了B和C類,而B和C類又繼承了A類。調用d.method()時,按照MRO的順序,會調用B類的method方法,因為在MRO中B類在C類之前。(繼承關系就近原則,D離B最近然后是C然后是A)。

class A:def method(self):print("A method")class B(A):def method(self):print("B method")class C(A):def method(self):print("C method")class D(B, C):passd = D()
d.method()  # 輸出: B method
print(D.__mro__)  # 輸出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

子類重寫父類的方法和屬性

在Python中,子類可以重寫父類的同名方法和屬性。這意味著子類可以提供自己的實現來覆蓋父類中的方法和屬性。這樣可以使得子類具有獨特的行為,同時保留與父類的接口一致性。

  • 重寫方法:當子類重寫父類的方法時,子類的方法會覆蓋父類的方法。在調用該方法時,將執行子類的實現。
  • 重寫屬性:當子類重寫父類的屬性時,子類中的屬性將覆蓋父類中的同名屬性。
super() 函數

有時子類需要在重寫方法或屬性時保留對父類實現的調用。可以使用?super()?函數來調用父類的方法。

示例:

# 父類
class Parent:def greet(self):return "父類"# 子類
class Child(Parent):def greet(self):# 帶參數的寫法,寫法一# parent_greeting = super(Child, self).greet()# 不帶參數的寫法,寫法二parent_greeting = super().greet()return f"{parent_greeting} 和 子類"child = Child()
print(child.greet())  # 輸出: 父類 和 子類

重寫和重載

  • 重寫

重寫指的是子類重新定義父類中的方法或屬性。通過重寫,子類可以提供自己的實現來替換父類的實現。重寫主要用于多態性和定制子類行為。

  • 重載?

重載指的是在同一個作用域中定義多個具有相同名字但參數不同的方法。在許多編程語言中(例如C++和Java),重載是允許的,編譯器會根據方法簽名(參數的數量和類型)來區分它們。然而,在Python中,方法重載并不直接支持。Python中的函數或方法如果使用相同的名字,后面的定義會覆蓋前面的定義。

盡管如此,Python可以通過默認參數和可變參數來實現類似重載的效果。

私有權限

在Python中,私有權限(Private Access)用于限制類屬性和方法的訪問,即私有屬性和私有方法。使其只能在類內部使用。這是通過命名約定和名稱改寫(name mangling)機制來實現的。

_ 單下劃線 (受保護)

單下劃線前綴表示“受保護的”變量或方法。這是一種約定,表示這些變量或方法不應該不推薦在類外部直接使用,雖然它們仍然可以被訪問。

示例:

class Hello:def __init__(self):self._protected_var = "我是受保護的屬性"def _protected_method(self):return "我是受保護的方法"hello = Hello()
# 依然可以訪問到,但是不推薦不應該訪問
print(hello._protected_var)          # 輸出:我是受保護的屬性
print(hello._protected_method())     # 輸出:我是受保護的方法
__ 雙下劃線 (私有)

雙下劃線前綴用于實現名稱改寫(name mangling),使得屬性或方法在類外部無法輕易訪問。Python會將這些名稱改寫為 _ClassName__variableName 的形式,從而實現基本的私有化。

示例:

get 私有屬性

class Hello:__private_var = "我是私有的屬性"def __private_method(self):return "我是私有的方法"# 用于訪問私有屬性def get_private_var(self):return self.__private_var# 用于訪問私有方法def get_private_method(self):return self.__private_method()hello = Hello()
# 以下訪問會報錯
# print(hello.__private_var)      # 出異常 AttributeError
# print(hello.__private_method()) # 出異常 AttributeError# 方式一:
# 通過類內部方法間接訪問
print(hello.get_private_var())          # 輸出:我是私有的屬性
print(hello.get_private_method())       # 輸出:我是私有的方法# 方式二:
# 通過名稱改寫訪問,改寫規則是 `_類名__變量方法名`
print(hello._Hello__private_var)        # 輸出:我是私有的屬性
print(hello._Hello__private_method())   # 輸出:我是私有的方法

set 私有屬性

class Hello:__private_var = "20"# 獲取私有屬性值def get_private_var(self):return self.__private_var# 修改私有屬性值def set_private_var(self, __private_var):self.__private_var = __private_varhello = Hello()# 獲取修改前的數據
print(hello.get_private_var())  # 20# 修改數據
hello.set_private_var("10")# 獲取修改后的數據
print(hello.get_private_var())  # 10
私有權限對于繼承的影響
  • 私有屬性和方法:在子類中無法直接訪問父類的私有屬性和方法。這是因為它們被名稱改寫,只有通過父類提供的公有方法間接訪問。例如,通過get_private_var()可以訪問父類的私有成員。

  • 受保護屬性和方法:子類可以直接訪問和調用父類的受保護屬性和方法,因為單下劃線只是一個約定,而不是嚴格的訪問控制。

  • 公有屬性和方法:子類可以直接訪問和調用父類的公有屬性和方法。

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

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

相關文章

js面試題2024

1.js的數據類型 boolean number string null undefined bigint symbol object 按存儲方式分&#xff0c;前面七種為基本數據類型&#xff0c;存儲在棧上&#xff0c;object是引用數據類型&#xff0c;存儲在堆上&#xff0c;在棧中存儲指針 按es標準分&#xff0c;bigint 和sym…

PHP框架講解 - symfony框架

Symfony 框架概述 Symfony 是一個用于構建 web 應用的 PHP 框架&#xff0c;它遵循 MVC&#xff08;模型-視圖-控制器&#xff09;模式&#xff0c;并且具有高度的可定制性。Symfony 是一個組件庫&#xff0c;它提供了許多用于構建現代 web 應用的工具和功能。以下是對 Symfon…

布隆過濾器 redis

一.為什么要用到布隆過濾器&#xff1f; 緩存穿透&#xff1a;查詢一條不存在的數據&#xff0c;緩存中沒有&#xff0c;則每次請求都打到數據庫中&#xff0c;導致數據庫瞬時請求壓力過大&#xff0c;多見于爬蟲惡性攻擊因為布隆過濾器是二進制的數組&#xff0c;如果使用了它…

FLD工作日志

在FLD的工作日志 一、技能掌握楊總經驗的傳輸 一、技能掌握 06.12 學會如何看小產品的代碼&#xff0c;看的消毒燈 07.08 1.學會嘉立創eda 楊總經驗的傳輸 07.07 什么能做就做什么&#xff0c;一刻也不要停不要看不起簡單的事情&#xff0c;量變引起質變

科普文:K8S中常見知識點梳理

簡單說一下k8s集群內外網絡如何互通的 要在 Kubernetes&#xff08;k8s&#xff09;集群內外建立網絡互通&#xff0c;可以采取以下措施&#xff1a; 使用service&#xff1a; 使用Service類型為NodePort或LoadBalancer的Kubernetes服務。這可以使服務具有一個公共IP地址或端口…

怎么發頂會論文

AI頂會論文成功發表路徑四&#xff1a;寫作關_嗶哩嗶哩_bilibili 全集都有&#xff0c;隨手記錄一下。 講的很好&#xff0c;我多努力。努力靠近一下。

Open3D 計算點云的平均密度

目錄 一、概述 1.1基于領域密度計算原理 1.2應用 二、代碼實現 三、實現效果 2.1點云顯示 2.2密度計算結果 一、概述 在點云處理中&#xff0c;點的密度通常表示為某個點周圍一定區域內的點的數量。高密度區域表示點云較密集&#xff0c;低密度區域表示點云較稀疏。計算…

Redis連接Resp圖形化工具和springboot

Redis連接Resp圖形化工具和springboot 1.redis配置1.1 備份、修改conf文件1.2 Redis的其它常見配置&#xff1a;1.3 啟動Redis&#xff1a;1.4 停止服務&#xff1a;1.5 開機自啟&#xff1a; 2. resp的安裝、配置和連接&#xff1a;2.1 GitHub上下載2.2 開始連接redis ![在這里…

Java 集合框架:Java 中的 Set 集合(HashSet LinkedHashSet TreeSet)特點與實現解析

大家好,我是栗箏i,這篇文章是我的 “栗箏i 的 Java 技術棧” 專欄的第 017 篇文章,在 “栗箏i 的 Java 技術棧” 這個專欄中我會持續為大家更新 Java 技術相關全套技術棧內容。專欄的主要目標是已經有一定 Java 開發經驗,并希望進一步完善自己對整個 Java 技術體系來充實自…

運營商二三要素是什么?有什么意義

運營商的二要素和三要素通常指的是在用戶身份驗證過程中所使用的關鍵信息。這些要素在保障用戶信息安全、防止詐騙犯罪、維護社會秩序等方面具有重要意義。 運營商二要素 運營商二要素指的是在身份驗證過程中&#xff0c;需要驗證的兩個關鍵信息&#xff0c;通常是&#xff1a…

C++初探究

概述 C可以追溯到1979年&#xff0c;C之父Bjarne Stroustrup在在使用C語言研發工作時發現C語言的不足&#xff0c;并想要將其改進&#xff0c;到1983年&#xff0c;Bjarne Stroustrup在C語言的基礎上添加了面向對象編程的特性&#xff0c;設計出了C的雛形。 網址推薦 C官方文…

Docker:WARNING: Published ports are discarded when using host network mode 解決方法

在Docker中&#xff0c;使用主機網絡模式&#xff08;host network mode&#xff09;時&#xff0c;容器將共享主機的網絡命名空間&#xff0c;這意味著容器將直接使用主機的網絡接口和端口。因此&#xff0c;當你嘗試通過Docker的發布端口功能&#xff08;publish a port&…

如何在uniapp中使用websocket?

websocket是我們經常使用到的接口,通常用于即時通訊以及K線圖這種需要實時更新數據的業務需求上,傳統的restful接口雖然可以滿足,但是你需要輪詢,這就要額外寫一堆代碼,不是很方便,用websocket就簡單很多,我們來看代碼 第一步定義全局常量、變量 const config = {host…

ActiViz實戰:ActiViz實現體繪制裁剪

文章目錄 效果預覽關鍵代碼源碼地址效果預覽 ActiViz體繪制裁剪 關鍵代碼 1、實現體繪制 FolderBrowserDialog folderDialog = new FolderBrowserDialog(); folderDialog.SelectedPath = "E:\\S100"; string

王老師 linux c++ 通信架構 筆記(三)安裝 xftp、

&#xff08;11&#xff09;調整 xshell 終端的字體大小&#xff0c;默認字體大小是 9 &#xff1a; &#xff08;12&#xff09; 共享文件夾 hgfs 的含義&#xff1a; &#xff08;13&#xff09;安裝 xftp &#xff0c; 傻瓜式安裝&#xff0c;出了修改下默認安裝位置。 操作…

.locked勒索病毒解析與防護指南

引言 隨著信息技術的飛速發展&#xff0c;網絡安全問題日益嚴峻&#xff0c;其中勒索病毒成為威脅企業和個人數據安全的重要隱患之一。在眾多勒索病毒家族中&#xff0c;.locked勒索病毒以其獨特的加密方式和廣泛的傳播途徑&#xff0c;引起了廣泛的關注。本文將從多個方面詳細…

使用redis-cli查找大key

執行命令 涉及redis-cli 連接和登錄&#xff0c;請查看&#xff1a;Redis-cli 連接Redis-CSDN博客 redis-cli -h <redis_instance_address> -p <port> -a <password> --bigkeys<redis_instance_address>&#xff1a; Redis 實例的 IP 地址。 <p…

opencv 魚眼圖像的矯正(動態參數調整)

一&#xff1a;棋盤校準參數說明(內參) 棋盤校準的方法及代碼很多&#xff0c;參見其他連接 1&#xff1a;內參矩陣 2&#xff1a;畸變系數 針對魚眼相機此處是4個參數&#xff0c;在其校準代碼中也可以知道&#xff0c;其通常的定義如下&#xff1a; data.camera_mat np.e…

報修小程序論文(設計)開題報告

一、課題的背景和意義 近些年來&#xff0c;隨著移動互聯網巔峰時期的來臨&#xff0c;互聯網產業逐漸趨于“小、輕、微”的方向發展&#xff0c;符合輕應用時代特點的各類技術受到了不同領域的廣泛關注。在諸多產品中&#xff0c;被譽為“運行著程序的網站”之名的微信小程序…

uniapp-小程序獲取用戶位置

1. 需要在微信公眾平臺進行接口的申請。選擇自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后&#xff0c;就可以使用了。 相關獲取位置API的鏈接 4. 如果要獲取當前位置到某一個指…