python核心階段(五)—— 面向對象三大特性

1.封裝

? ? 概念:封裝主要是指將一些屬性和相關方法封裝在一個對象中,對外隱藏內部具體實現細節

? ? 作用:1)使用起來更加方便,類似于提供了一個工具箱

? ? ? ? ? ? ? ?2)保證數據的安全(設置私有屬性)

? ? ? ? ? ? ? ?3)利于代碼維護(代碼維護時,直接在類內部修改即可,外部無需修改)

2.繼承

?2.1 繼承的基本知識

  • 概念:一個類"擁有"另外一個類的"資源"(指"非私有的"屬性和方法使用權
  • 作用:資源重用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  • 分類:單繼承(只繼承了一個父類)、多繼承(繼承了多個父類)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  • 語法:? class 子類名(父類名):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pass? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??父類名可以寫多個,用逗號“,”隔開,越靠前繼承的優先級越高? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  • 常用內置屬性:__bases__?? ? ? ? ? ? ? ? ? ? 查看類的所有父類構成元組? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  • object 和 type 的區別:

? ? ? ? type:元類,是用來創建類的類

? ? ? ? object:類對象,主要是判別新式類(繼承了object類)和經典類(沒繼承object類),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? python3版本,在創建類時,默認繼承object類,即:默認創建新式類

object 和 type 的區別

?2.2?繼承下的影響?

? ? 2.2.1 資源的繼承

? ? ? 在python中,繼承是指對父類資源的使用權 /訪問權

? ? ? 除了私有的屬性和私有的方法, 其他的基本都能繼承(共有、受保護、內置)

? ? ? 在子類中,不能修改父類的屬性 / 方法,修改操作相當于在子類中新增一個同名屬性

? ? 2.2.2 資源的使用

  • 繼承的幾種形態以及遵循的準則
  • Python3.x之后新式類的方法解析順序(MRO):C3算法
形態具體描述資源查找原則
單繼承鏈一個子類只有一個父類

遵循"從下到上"的原則

自身 一> 父類 一> 父類的父類

無重疊的多繼承鏈繼承鏈無交叉, 無公共父類

遵循"單調"原則

?順著一條鏈找到底

A?一> B 一> D 一> C 一> E

有重疊的多繼承鏈繼承鏈有交叉, 有公共父類

遵循"從下到上"的原則

一級一級查找

A?一> B 一> C?一> D

幾種繼承形態圖示

  • ?針對于幾種標準原則的發展演變
針對于幾種標準原則的發展演變

  • 查看某個類的資源查找順序的語法:
法一(inspect包)

import? inspect?

? inspect.getmro(類名)

法二(mro屬性)

類名.__mro__

法三(mro函數)

類名.mro()

? ? 2.2.3?資源的覆蓋

? ? ? 資源覆蓋包括屬性的覆蓋和方法重寫。在MRO的資源檢索鏈中,若優先級高的類和優先級低的類都寫了一個一樣的資源(屬性或方法),則在獲取資源時,會優先選擇優先級高的類中的資源,而摒棄優先級低的資源,就造成了“覆蓋”的假象

? ? ? ?注意:如果子類方法調用了父類的方法,那么此時參數self和cls是調用這個方法的那個類/屬性

? ? 2.2.4 資源的累加?

? ? ? ?概念:在一個類的基礎之上, 增加一些額外的資源

  • 場景一:子類相比于父類, 多一些自己特有的方法/屬性

? ? ? ? 實現方式:直接在子類中定義就可

  • 場景二:在被“覆蓋”的方法基礎之上,新增新的內容(即:保留舊的某個方法并擴展新內容)

? ? ? ? 實現方式一:在高優先級類的方法中, 通過"類名"調用低優先級類的方法

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這里不能用實例調用,會導致self輸入不一致

? ? ? ? ? ? ? ? ? ? 弊端:對于有重疊的多繼承鏈,會產生重復調用;代碼不易維護

class B:def __init__(self):self.weight = 60self.height = 1.75class A(B):  # A類繼承了B類def __init__(self):B.__init__(self) # 通過類名調用B中的init,保留原來內容# 這里不能通過其他方式調用,會導致self輸入不一致self.bmi = 1  # 新增額外內容a = A()
print(a.__dict__)

? ? ?

? ? ??實現方式二:在低優先級類的方法中, 通過"super"調用高優先級類的方法

? ? ? ? ? ? ? super是一個類,它只在新式類中有效,它主要起代理作用,幫助我們沿著MRO鏈條,找到下一個節點,去調用對應方法?

? ? ? ? ? ? ? ?語法:super(). 方法名? ? ? ? ? ?在 python3.x 的版本中,不需要填寫參數,會自動補全

? ? ? ? ? ? ? ?實現原理:def super(cls參數一, inst參數二):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mro = inst.__class__.mro()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return mro[mro.index(cls) + 1]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 相當于沿著參數二的mro順序,找到參數一對應的節點+1,即參數一的下一個節點

# 繼承關系  A 一> B,C 一> D
# 在這種情況下,如果使用方法一在B C中調用D,再在A中調用B C,就會重復調用D兩次
# 使用super調用,就不會重復出現
class D(object):def __init__(self):print("d")class B(D):def __init__(self):super().__init__()print("b")class C(D):def __init__(self):super().__init__()print("c")class A(B,C):def __init__(self):super().__init__()print("a")A()

3.多態

  • 多態大致有兩種含義:

? ? ? ? ? ? ? ? ? 1)一個類, 所延伸的多種形態(animal可以延伸出dog cat...);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)調用時的多種形態(dog和cat中都有同一屬性/方法,但調用時輸出不同)

  • 多態在python中的體現:

? ? ? ? ? 鴨子類型(動態類型的一種風格),它的關注點在于對象的"行為和屬性"; 而非對象的"類型"

  • ? ? 回憶:

? ? ? ? ? ? python是強類型(類型強勢,不會輕易自動修改)、動態類型(數據的類型在運行時可以? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 判定,動態修改)? ? ? ? ? ? ? 而多態一般是體現在靜態語言中,所以在python中沒有真正意義上的多態,也不需要多態?

4.補充:抽象類、抽象方法

  • 概念

? ? ? ? ?抽象類 是指一個抽象出來的類,并不是某一個具化的類,它是一個不能直接創建實例的類,? ? ? ? ? ? ? ? ? ? ? ? 主要是用于被其他類繼承

? ? ? ? ?抽象方法 是指抽象出來的一個方法,不具備具體實現,不能直接調用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果一個類中有抽象方法,當他被繼承時,繼承他的類中必須要具體定義這個方法

  • 例子:

? ? ? ? ? ?animal類就是一個抽象類,他只是存儲了所有動物的一些特性,但并不能直接去使用,因? ? ? ? ? ? ? 為我們不知道到底是什么動物,同理animal的各種方法,如體型聲音等也是如此

  • 在python中的實現:

? ? ? ? ? 導入模塊abc? ——> 設置類的元類為abc.ABCMeta? ——>? 使用裝飾器裝飾抽象方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@abc.abstractmethod

5.案例?

  • 要求:

? ? ? ? ?1. 定義三個類, 小狗, 小貓, 人

? ? ? ? ?2.三個類具體要求如下:

? ? ? ? ? ? 小狗: 姓名, 年齡(默認1歲); ? ?吃飯, 玩, 睡覺, 看家(格式: 名字是xx, 年齡xx歲的小狗在xx)

? ? ? ? ? ? 小貓: 姓名, 年齡(默認1歲);? ?吃飯, 玩, 睡覺, 捉老鼠(格式: 名字是xx, 年齡xx歲的小貓在xx)

? ? ? ? ? ??人: ? 姓名, 年齡(默認1歲), 寵物; ?吃飯, 玩, 睡覺(格式: 名字是xx, 年齡xx歲的人在xx)
? ? ? ? ? ? ? ? ? ? 養寵物(讓所有的寵物吃飯, 玩, 睡覺),?
? ? ? ? ? ? ? ? ? ? 寵物工作(讓所有的寵物根據自己的職責開始工作)?

# 案例
# 我們發現在三個大類中,有很多相同的屬性,所以我們可以先定義一個父類,讓他們都繼承即可class Animal():def __init__(self, name, age=1):self.name = nameself.age = agedef eat(self):print(f"{self}吃飯")def play(self):print(f"{self}玩")def sleep(self):print(f"{self}睡覺")class Person(Animal):   #定義人# 在創建小狗實例時,給它設置幾個屬性,所以這里應該定義實例屬性def __init__(self,name,pet,age=1):super(Person,self).__init__(name,age)self.pet = petdef __str__(self):  # self本身的一個字符串描述  print(self)直接輸出下面字符串return f"名字是{self.name}, 年齡{self.age}歲的人在"def yangPets(self):for pet in self.pet:pet.eat()pet.play()pet.sleep()def petWork(self):for pet in self.pet:pet.work()class Dog(Animal):  #定義狗類# 在創建小狗實例時,給它設置幾個屬性,所以這里應該定義實例屬性def __init__(self, name, age=1):super(Dog,self).__init__(name,age)def work(self):print(f"{self}看家")def __str__(self):  # self本身的一個字符串描述  print(self)直接輸出下面字符串return f"名字是{self.name}, 年齡{self.age}歲的小狗在"class Cat(Animal):  #定義貓類# 在創建小貓實例時,給它設置幾個屬性,所以這里應該定義實例屬性def __init__(self, name, age=1):super(Cat,self).__init__(name,age)def work(self):print(f"{self}捉老鼠")def __str__(self):  # self本身的一個字符串描述  print(self)直接輸出下面字符串return f"名字是{self.name}, 年齡{self.age}歲的小貓在"d = Dog("卡布",5)
c = Cat("喵喵",3)
p = Person("李明",[d,c],25)p.yangPets()
p.petWork()

6.總結:面向對象原則 SOLID(了解)

  • S:單一職責原則(一個類只負責一項職責)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
  • O:開放封閉原則(對擴展開放,對修改關閉)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  • ?L:里氏替換原則(使用父類引用的地方必須能使用子類對象)??
    ?? ?
  • ?I:接口分離原則(如果類包含了過多的接口方法,而這些方法在使用的過程中并非"不可分? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 割", 那么應當把他們進行分離)
    ? ? ??所謂接口, 在Python中, 可以簡單的理解為"抽象方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  • ?D:依賴倒置原則(高層模塊不應該直接依賴低層模,他們應該依賴抽象類或者接口塊)
    ?? ?
    ?? ?

?

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

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

相關文章

高精度加法,減法,乘法,除法(下)(C語言)

前言 上一篇博客我們分享了高精度加法,減法,這一期我將為大家講解高精度乘法和高精度除法。那讓我們開始吧! 對加法和減法感興趣的話就點我 文章目錄 1,乘法2,除法3,尾聲 1,乘法 讓我們想想我們平時做數學…

openpyxl讀取Excel文件忽略單元格公式僅讀取所顯示的值

目錄 前言解決方案先不加:看讀取信息加上參數:看讀取信息完整代碼 前言 我們在讀取Excel文件時,假如某行或者某列是利用公式生成的,但是我們在利用openpyxl進行讀取時,發現讀取到的是公式,而非顯示的值 解…

Java并行和并發有什么區別?

Java并行和并發有什么區別? 并行和并發是兩個在多線程編程中經常使用的概念,它們描述了不同的多任務處理方式。 并發(Concurrency): 定義:并發是指多個任務共享資源,但是并不一定同時執行。它強…

pipe函數、SIGCHLD、execvp

pipe函數 以下是一個使用C語言編寫的通過管道&#xff08;pipe&#xff09;進行進程間通信的示例代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>int main() {int pipefd[2];pid_t pid;char b…

[⑧ADRV902x]: Digital Pre-Distortion (DPD)學習筆記

前言 DPD 數字預失真技術&#xff0c;是一種用于抑制功率放大器非線性失真的方法。 它通過在信號輸入功率放大器&#xff08;PA&#xff09;之前插入一個預失真模塊&#xff0c;對輸入信號進行適當的調制&#xff0c;以抵消功率放大器引起的非線性失真&#xff0c;使功率放大器…

Ubuntu 安裝 CUDA 和 cuDNN 詳細步驟

我的Linux系統背景&#xff1a; 系統和驅動都已安裝。 系統是centos 8。查看自己操作系統的版本信息&#xff1a;cat /etc/issue或者是 cat /etc/lsb-release 用nvidia-smi可以看到顯卡驅動和可支持的最高cuda版本&#xff0c;我的是12.2。驅動版本是535.129.03 首先&#…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-9閾值選取-機器視覺中應用正態分布和6-sigma

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-數學基礎Ch0-9閾值選取-機器視覺中應用正態分布和6-sigma 5M1E——造成產品質量波動的六因素 人 Man Manpower 機器 Machine 材料 Material 方法 Method 測量 Measurment 環境 Envrionment DMAI…

RESTful 服務的開發

目錄 1.RESTful風格介紹2.使用 RESTful 風格設計的用戶管理 Web API 的示例代碼13.RESTful 風格設計的用戶管理 Web API 的示例代碼2 1.RESTful風格介紹 RESTful&#xff08;Representational State Transfer&#xff09;是一種軟件架構風格&#xff0c;用于設計網絡應用程序的…

模塊電源(六):前饋電容

一、前饋電容&#xff1a; 前饋電容是與電阻分壓的頂部電阻 并聯的"可選電容器" 二、計算及仿真&#xff1a; 1、計算 無前饋電容時&#xff0c;輸出電壓&#xff1a;&#xff1b;有前饋電容時&#xff0c;輸出電壓&#xff1a;&#xff0c;(其中&#xff0c;&am…

Java工程找不到javax.xml.bind.annotation包

文章目錄 問題解決方法參考 問題 最近Java工程找不到javax.xml.bind.annotation包&#xff0c;進行了解決。 解決方法 參考 stackoverflow: package javax.xml.bind.annotation does not exist error javax.xml.bind這個庫從Java 11版本就被移除了&#xff0c;缺失了這個包…

crmeb本地開發配置代理

crmeb 是一個開源的商城系統&#xff0c; v5 版本是一個前后端分離的項目&#xff0c; 我們從git倉庫中下載下來的是一個文件夾&#xff0c;其結構是這樣的 我的系統沒有使用docker &#xff0c;使用的是 laragon 的系統 所以首先我們要在 nginx 中配置 之后&#xff0c; 我們…

WebStorm:Mac/Win上強大的JavaScript開發工具

WebStorm是JetBrains公司開發的針對Mac和Windows系統的JavaScript開發工具。它為開發者提供了一站式的代碼編輯、調試、測試和版本控制等功能&#xff0c;幫助你更高效地進行Web開發。新版本的WebStorm 2023在性能和用戶體驗方面都做出了重大改進&#xff0c;讓你的JavaScript開…

為什么感染HPV的人越來越多?勁松中西醫結合醫院專家發表看法

近年來&#xff0c;HPV感染率在我國呈現上升趨勢&#xff0c;引起了社會的廣泛關注。HPV是一種人乳頭瘤病毒&#xff0c;主要通過性接觸傳播&#xff0c;也是引起宮頸癌的主要原因之一。那么&#xff0c;為什么我國的HPV感染率如此高呢&#xff1f; 首先&#xff0c;我們需要了…

深度學習疲勞檢測 駕駛行為檢測 - python opencv cnn 計算機競賽

文章目錄 0 前言1 課題背景2 相關技術2.1 Dlib人臉識別庫2.2 疲勞檢測算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手機檢測3.4 抽煙檢測3.5 喝水檢測 4 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度學習加…

遠程服務器QEMU+Ubuntu+GRUB+VNC最佳實踐

遠程服務器QEMUUbuntuGRUBVNC最佳實踐 1. 準備2. QEMU啟動安裝Ubuntu2.1 服務器端2.2 本地端 3. 從服務器終端控制虛擬機GRUB與虛擬機終端 這段時間參與大量內核切換測試工作&#xff0c;實體機需要硬件自檢太過笨重&#xff0c;因此主要通過QEMU驗證正確性。有一個很大的問題是…

JavaSE基礎50題:11. 輸出一個整數的每一位

概述 輸出一個整數的每一位。 如&#xff1a;1234的每一位是4&#xff0c;3&#xff0c;2&#xff0c;1 。 個位&#xff1a;1234 % 10 4 十位&#xff1a;1234 / 10 123 123 % 10 3 百位&#xff1a;123 / 10 12 12 % 10 2 千位&#xff1a; 12 / 10 1 代碼 ublic sta…

ResourceBundle使用詳解

ResourceBundle使用詳解 這個類主要用來解決國際化和本地化問題。國際化和本地化可不是兩個概念&#xff0c;兩者都是一起出現的。可以說&#xff0c;國際化的目的就是為了實現本地化。比如對于“取消”&#xff0c;中文中我們使用“取消”來表示&#xff0c;而英文中我們使用…

【小白專用】MySQL入門(詳細總結)

3. 創建數據庫 使用 create database 數據庫名; 創建數據庫。 create database MyDB_one; create database DBAliTest; 創建數據庫成功后&#xff0c;數據庫的數量變成了6個&#xff0c;多了剛才創建的 dbalitest 。 4. 創建數據庫時設置字符編碼 使用 create database 數據…

YouTube網紅營銷:出海品牌擴大影響力的關鍵

隨著數字媒體的興起&#xff0c;社交媒體已成為品牌與消費者之間建立聯系的重要橋梁。其中&#xff0c;YouTube作為全球最大的視頻分享平臺&#xff0c;不僅擁有龐大的用戶群體&#xff0c;還聚集了眾多有影響力的網紅。這些網紅在各自的領域內擁有強大的話語權和號召力&#x…

MySQL數據庫,初學SQL知識點引入

數據庫的相關概念&#xff1a; DB&#xff1a;數據庫&#xff08;Database&#xff09;&#xff1a; 即存儲數據的倉庫&#xff0c;其本質是一個文件系統。保存了一系列有組織的數據。 DBMS&#xff1a;數據庫管理系統&#xff08;Database Management System&#xff09;&…