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