織夢網(wǎng)站后臺關(guān)鍵詞推廣優(yōu)化app
文章目錄
- 一、封裝
- 二、繼承
- 三、多態(tài)
- 四、聚合/組合
- 五、接口/實(shí)現(xiàn)
- 六、抽象
一、封裝
封裝 Encapsulation
- 封裝是隱藏對象實(shí)現(xiàn)細(xì)節(jié)的過程
- 內(nèi)部狀態(tài)通常不能被其他對象訪問
- 對象的數(shù)據(jù)只能通過接口去訪問
- 封裝使得對象可以被看成一個“黑盒子”
- 它保護(hù)對象的內(nèi)部狀態(tài)不被其他對象破壞
- 一個對象實(shí)現(xiàn)方法的改變,不影響其他相關(guān)對象
- 對象間通過“接口”進(jìn)行通信
封裝內(nèi)容
- 內(nèi)部的、不想讓其他人隨意了解的信息
- 可以封裝類的屬性,如,“人” 這個類,封裝個人的工資、資產(chǎn)、年齡等信息
- 可以封裝類的方法,如, “人”如何賺錢()?如何消磨時間()?
封裝目的
- 保護(hù)隱私
- 保護(hù)數(shù)據(jù)安全
- 隔離復(fù)雜度 (內(nèi)部實(shí)現(xiàn)細(xì)節(jié)不對外公開)。如“空調(diào)”,封裝了制冷的過程,對人提供了一個制冷的按鈕
封裝方式:Public、Private、Protected和Package
封裝原則:對象應(yīng)該只顯示與其交互所需的接口。與對象的使用無關(guān)的細(xì)節(jié)應(yīng)該對其他對象隱藏起來。
封裝建議:設(shè)置屬性的 getter 和 setter 方法,實(shí)現(xiàn)對數(shù)據(jù)的隱藏,因?yàn)槠渌麑ο蟛粦?yīng)該直接操作另一個對象中的數(shù)據(jù)。
class Student:def __init__(self):self._name = None@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = names = Student()
s.name = "張三" # 調(diào)用 setter
print(s.name) # 調(diào)用 getter,輸出 張三
二、繼承
繼承 Inheritance
- 一個類獲取另一個類的狀態(tài)和行為,并添加額外的狀態(tài)和行為
示例:噴氣式飛機(jī)類繼承飛機(jī)類
class Airplane:def __init__(self):self.speed = Nonedef get_speed(self):return self.speeddef set_speed(self, speed):self.speed = speedclass Jet(Airplane):def __init__(self, multiplier=2):super().__init__()self.multiplier = multiplier # Super()和Super關(guān)鍵字用于引用超類# 不需要定義get_speed()方法,它已繼承過來def set_speed(self, speed): # set_speed()方法覆蓋了父類Airplane中的行為return super().set_speed(speed * self.multiplier)def accelerate(self): # 子類可以定義新的行為super().set_speed(super().get_speed() * 2)j = Jet()
j.set_speed(1000)
print(j.get_speed()) # 輸出 2000
j.accelerate()
print(j.get_speed()) # 輸出 4000
三、多態(tài)
多態(tài) Polymorphism
- 當(dāng)一個類從另一個類繼承而來,多態(tài)使得子類可以代替父類
- 消息發(fā)送方不需要知道消息接收方屬于那個子類
- 同一類族的接收者可以按自己的方式處理信息
- 同一類族的接受者可以按自己的方式處理同一個消息
- 可以有不同的對象以不同的方式處理相同的數(shù)據(jù)
多態(tài)的核心思想/設(shè)計(jì)模式的基礎(chǔ)
- 使用指向父類的指針或者引用,能夠調(diào)用子類的對象
- 示例:用shape分別引用Circle和Rectangle子類的對象
from abc import ABC, abstractmethodclass Shape(ABC):def __init__(self):self.area = None@abstractmethoddef get_area(self):passclass Circle(Shape):def __init__(self, r):self.radius = rdef get_area(self):return 3.14 * self.radius**2class Rectangle(Shape):def __init__(self, l, w):self.length = lself.width = wdef get_area(self):return self.length * self.widthcircle = Circle(5)
rectangle = Rectangle(4, 5)
lst = []
lst.append(circle)
lst.append(rectangle)
while len(lst) != 0:shape: Shape = lst.pop()print(f"面積:{shape.get_area()}") # 不必關(guān)心它是具體哪種形狀### 輸出結(jié)果
面積:20
面積:78.5
四、聚合/組合
聚合/組合 Aggregation/Composition
-
聚合/組合,都是描述整體與部分的關(guān)系
-
聚合描述了一種“有”關(guān)系。一個對象是另一個對象的一部分,或者一個對象包含一組其他對象。
-
聚合關(guān)系是可傳遞的:如果A包含B, B包含C,那么A包含C。
-
聚合關(guān)系是不對稱的:如果A包含B,那么B不包含A
-
組合是聚合關(guān)系的一個變種,是一種強(qiáng)依賴關(guān)系,表示部分和整體的生命周期是一致的,即部分不能脫離整體而單獨(dú)存在。部分對象只能存在于整體對象之中,整體對象控制部分對象的生命周期。
-
有些時候,聚合與組合的關(guān)系不是很明確
五、接口/實(shí)現(xiàn)
接口/實(shí)現(xiàn) Interface /Implementation
-
軟件系統(tǒng)的內(nèi)部是由大量的互相關(guān)聯(lián)的類構(gòu)成的。當(dāng)對其中某一個類的局部進(jìn)行修改的時候,不能影響其它的類
-
接口:描述一個類的用戶如何與這個類交互
-
實(shí)現(xiàn):完成接口所定義的功能、任務(wù)。
- 對實(shí)現(xiàn)的更改不應(yīng)該要求對用戶代碼進(jìn)行更改。
- 用戶和實(shí)現(xiàn)都必須符合接口規(guī)范。
-
示例:TV是顧客、用戶,插座是接口,發(fā)電廠是實(shí)現(xiàn)
六、抽象
抽象 Abstraction
- 抽象表示一個對象與其他所有對象相區(qū)別的基本特征,因此提供了同觀察者角度有關(guān)的清晰定義的概念界限。
- 抽象是專注于最重要的方面而忽略次要細(xì)節(jié)的過程。使得我們可以通過專注于實(shí)體區(qū)別于其他實(shí)體的關(guān)鍵特征來有效管理(降低)復(fù)雜性
- 抽象就是過濾掉對象的一部分特性和操作,直到只剩下你所需要的屬性和操作
抽象是一種思維方式、一種思維能力
- 抽象是面向?qū)ο箢I(lǐng)域發(fā)現(xiàn)類的主要方法
- 客觀世界的事物由各種各樣的實(shí)體(對象)構(gòu)成,每個對象都有各自的內(nèi)部狀態(tài)和運(yùn)動(狀態(tài))規(guī)律
- 根據(jù)對象的屬性和運(yùn)動規(guī)律的相似性可以將對象分類
- 復(fù)雜對象由相對簡單的對象組成
- 不同對象的組合及其之間的相互作用和聯(lián)系構(gòu)成了系統(tǒng)
- 對象間的相互作用通過消息傳遞,對象根據(jù)所接收到的消息做出自身的反應(yīng)
您正在閱讀的是《面向?qū)ο蠓治雠c設(shè)計(jì)Python版》專欄!關(guān)注不迷路~