国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Python OOP 設(shè)計(jì)思想 10:組合優(yōu)先于繼承

0
分享至

在 Python 中,繼承并非類型建模的核心手段。多態(tài)來源于調(diào)用點(diǎn),接口產(chǎn)生于使用方式,而對(duì)象之間的可替換性取決于行為一致性,而非形式上的繼承關(guān)系。因此,在實(shí)踐層面,當(dāng)需要擴(kuò)展能力、組織復(fù)雜行為或應(yīng)對(duì)需求變化時(shí),組合應(yīng)當(dāng)優(yōu)先于繼承。這并非一句設(shè)計(jì)口號(hào),而是 Python 對(duì)象模型、協(xié)議機(jī)制與動(dòng)態(tài)行為綁定方式自然導(dǎo)出的結(jié)論。

10.1 組合的基本思想

組合(Composition) 的思想非常樸素:不要通過“成為某種類型”來獲得能力,而是通過“擁有某種對(duì)象”來獲得能力。

(1)繼承方式:通過 is-a 關(guān)系獲得能力

car.move()  # 通過繼承獲得 move 能力

在繼承方案中,Car 通過成為 Vehicle 的子類獲得 move() 行為,其能力來源與類型身份被強(qiáng)綁定。一旦繼承關(guān)系成立,Car 便不可避免地承載 Vehicle 的全部語義。

(2)組合方式:通過 has-a 關(guān)系獲得能力

car2.start()    # Engine started

而在組合方案中,Car2 并未聲明自己“是某種類型”,而是通過持有 Engine 對(duì)象獲得啟動(dòng)能力。能力的來源是對(duì)象協(xié)作關(guān)系,而非類型歸屬關(guān)系。

這正是組合的核心思想:對(duì)象通過“擁有誰”來獲得能力,而不是通過“成為誰”來獲得能力。能力是可配置的,而身份不再被固化。

10.2 行為組合而非類型擴(kuò)展

繼承的一個(gè)根本問題在于:它擴(kuò)展的是“類型整體”,而非“具體所需行為”。

(1)繼承的問題:無關(guān)能力被一并繼承

        

UserService 只關(guān)心數(shù)據(jù)庫連接能力,卻被迫繼承了 backup() 這一與其職責(zé)無關(guān)的行為。這并非代碼錯(cuò)誤,而是類型繼承天然放大的語義耦合。

上述示例揭示了繼承在復(fù)雜系統(tǒng)中的一個(gè)根本問題:繼承擴(kuò)展的是“父類的整體語義”,而非子類真正需要的那一部分行為。

(2)使用組合,可以只獲取真正需要的行為

service.get_user(123)

組合方案中,UserService2 僅依賴 get_connection() 這一最小行為協(xié)議。它并不關(guān)心連接來自連接池、直連數(shù)據(jù)庫,還是其他來源。

這表明,組合關(guān)注“行為拼裝”,繼承則綁定“語義整體”。前者更符合 Python 的協(xié)議與使用導(dǎo)向設(shè)計(jì)。

10.3 委托模式的自然表達(dá)

在 Python 語境中,“委托”并不是一種需要刻意實(shí)現(xiàn)的設(shè)計(jì)模式,而是一種對(duì)象協(xié)作關(guān)系的自然結(jié)果。

所謂委托(Delegation),是指一個(gè)對(duì)象并不自行完成某項(xiàng)職責(zé),而是將該職責(zé)轉(zhuǎn)交給其持有的另一個(gè)對(duì)象,并由后者完成具體工作。調(diào)用方只與“委托者”交互,而實(shí)際行為由“被委托者”承擔(dān)。

與繼承不同,委托并不建立類型層級(jí),也不形成身份綁定。它只表達(dá)一種運(yùn)行期的職責(zé)分工關(guān)系:誰負(fù)責(zé)協(xié)調(diào),誰負(fù)責(zé)執(zhí)行。這使得行為可以被自由替換,而對(duì)象身份保持穩(wěn)定。

processor.process("test")

DataProcessor 不自己實(shí)現(xiàn)難邏輯,而是接收一個(gè) validator 對(duì)象并將校驗(yàn)職責(zé)委托給它。只要該對(duì)象提供 validate() 行為,就可以參與協(xié)作。

關(guān)鍵不在于 SimpleValidator 是否繼承自某個(gè)基類,而在于它是否履行了被委托的職責(zé)。

這種設(shè)計(jì)使得:

? 職責(zé)劃分清晰

? 校驗(yàn)策略可在運(yùn)行期替換

? 新行為無需修改既有類型層級(jí)

委托在這里不是“應(yīng)用某種模式”,而是組合思想在 Python 對(duì)象模型中的自然體現(xiàn)。

10.4 組合帶來的演化自由

組合最大的價(jià)值,往往并不體現(xiàn)在初始設(shè)計(jì),而體現(xiàn)在系統(tǒng)的演化階段。

)).run()

Application 并不關(guān)心日志的具體實(shí)現(xiàn)細(xì)節(jié),只依賴 log() 行為協(xié)議。日志能力既可以來自單一對(duì)象,也可以來自多個(gè)對(duì)象的組合。

當(dāng)需求從“只打印”演化為“同時(shí)打印并寫文件”時(shí),繼承方案往往需要引入新的子類或調(diào)整層級(jí),而組合方案只需重新拼裝已有組件。

這正是 Python 倡導(dǎo)的設(shè)計(jì)方向:穩(wěn)定的是接口與使用方式,可變的是實(shí)現(xiàn)與組合結(jié)構(gòu)。

10.5 組合與測試友好性

組合能夠顯著提升可測試性,其關(guān)鍵原因在于它天然支持“依賴注入”。

所謂依賴注入(Dependency Injection),并不是指某種框架或技術(shù),而是一種構(gòu)造方式上的選擇:對(duì)象不自行創(chuàng)建其依賴,而是通過構(gòu)造參數(shù)、屬性或方法參數(shù)接收外部提供的依賴對(duì)象。

這種方式將“對(duì)象的行為邏輯”與“依賴的獲取方式”解耦,使得依賴可以在不同環(huán)境下被自由替換,尤其適合測試、模擬與運(yùn)行期配置。

        

        

        return {"status": "success", "amount": amount}

    

OrderService 通過初始化函數(shù)接收 payment_gateway,使其核心邏輯與外部依賴完全解耦。

? 依賴注入:將對(duì)象的依賴通過參數(shù)傳遞,而不是在對(duì)象內(nèi)部創(chuàng)建

? 控制反轉(zhuǎn):控制權(quán)從 OrderService 轉(zhuǎn)移到外部調(diào)用者

? 依賴倒置:依賴抽象(charge 方法接口),不依賴具體實(shí)現(xiàn)

測試時(shí),可以輕松注入一個(gè)行為可控、狀態(tài)可觀察的模擬對(duì)象。

    print(f"   結(jié)果: {flexible_service.place_order(300)}")

這種設(shè)計(jì)避免了:

? 復(fù)雜的繼承測試替身

? 隱式的全局依賴

? 對(duì)真實(shí)外部系統(tǒng)的調(diào)用

組合使測試關(guān)注點(diǎn)回歸業(yè)務(wù)行為本身,而不是被迫處理類型結(jié)構(gòu)。這也是 Python 項(xiàng)目中普遍采用依賴注入與組合的重要原因。

10.6 組合與策略模式

當(dāng)系統(tǒng)中存在可變行為需要在運(yùn)行期進(jìn)行切換或替換時(shí),組合比繼承更具穩(wěn)定性與表達(dá)力。所謂“策略模式”(Strategy Pattern),本質(zhì)上正是組合思想在行為層面的一種具體體現(xiàn)。

在 Python 中,策略并不等同于固定的類層級(jí)或抽象接口結(jié)構(gòu)。它強(qiáng)調(diào)的是:將可變算法獨(dú)立封裝為對(duì)象,并通過組合在運(yùn)行期注入或替換。調(diào)用方只依賴穩(wěn)定的行為協(xié)議,而不關(guān)心具體策略的類型身份。

因此,策略模式并非組合之外的另一種設(shè)計(jì)技巧,而是組合在“可變行為”這一問題域中的自然落點(diǎn)。策略對(duì)象可以是任意提供所需行為的對(duì)象,是否繼承自統(tǒng)一父類并不關(guān)鍵。

下面的示例將展示:策略模式在 Python 中往往通過組合與委托自然形成,而非通過復(fù)雜的繼承結(jié)構(gòu)刻意實(shí)現(xiàn)。

archiver.archive("data")   # 輸出:"GZIP compressed: data"

策略是否繼承自同一父類并不重要,重要的是調(diào)用點(diǎn)依賴的行為是否一致。

DataArchiver 只依賴 compress() 行為協(xié)議,因此壓縮策略可以在運(yùn)行期自由替換。這種替換并不會(huì)改變 DataArchiver 的身份或結(jié)構(gòu)。

策略模式的優(yōu)勢在此體現(xiàn)為:

? 算法可互換:同一操作(archive)使用不同算法(ZIP/GZIP)

? 運(yùn)行時(shí)靈活性:無需重新創(chuàng)建對(duì)象即可改變行為

? 客戶端透明:archive() 調(diào)用方式不變,但內(nèi)部算法已改變

很顯然,策略模式并非以繼承為中心,而是以行為協(xié)議為中心。

這再次表明:在 Python 中,組合與協(xié)議天然協(xié)同,而繼承只是可選工具。

小結(jié)

在 Python 中,能力的獲得不應(yīng)依賴類型身份,而應(yīng)來源于對(duì)象協(xié)作。組合通過行為拼裝而非類型擴(kuò)展,使對(duì)象關(guān)系保持松耦合、可替換且易演化。委托、策略與依賴注入并非刻意設(shè)計(jì)的模式,而是組合思想在 Python 對(duì)象模型中的自然結(jié)果。將繼承限制為少數(shù)穩(wěn)定擴(kuò)展點(diǎn),并優(yōu)先采用組合,是 Python 面向?qū)ο笤O(shè)計(jì)保持靈活性與可維護(hù)性的根本原因。


點(diǎn)贊有美意,贊賞是鼓勵(lì)

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
廣東108-78遼籃!球員評(píng)分:3人滿分,3人良好,1人不合格

廣東108-78遼籃!球員評(píng)分:3人滿分,3人良好,1人不合格

多特體育說
2026-01-11 21:39:19
蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

三農(nóng)雷哥
2026-01-11 17:28:07
萬萬沒想到!李晨會(huì)因?yàn)槔先宋兜巧蠠崴,感覺他這輩子很難結(jié)婚了

萬萬沒想到!李晨會(huì)因?yàn)槔先宋兜巧蠠崴眩杏X他這輩子很難結(jié)婚了

樂悠悠娛樂
2025-12-02 11:01:18
打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

足球大腕
2026-01-11 22:02:43
羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

豐譚筆錄
2026-01-07 10:59:38
遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

籃球資訊達(dá)人
2026-01-11 22:32:21
2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

叮當(dāng)當(dāng)科技
2026-01-07 13:58:49
愛奇藝、騰訊、優(yōu)酷三大平臺(tái)“王炸劇”紛紛登場,誰能登頂劇王?

愛奇藝、騰訊、優(yōu)酷三大平臺(tái)“王炸劇”紛紛登場,誰能登頂劇王?

鄉(xiāng)野小珥
2026-01-12 05:57:22
乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

民哥臺(tái)球解說
2026-01-12 05:20:12
氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個(gè)月,生理倒拔20歲

氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個(gè)月,生理倒拔20歲

科學(xué)認(rèn)識(shí)論
2026-01-11 17:13:05
開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

搜史君
2025-12-31 13:00:10
形勢突變!別了,北約!美國這次玩真的!

形勢突變!別了,北約!美國這次玩真的!

李榮茂
2026-01-12 07:03:16
哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

溫讀史
2026-01-10 07:33:53
拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

浮萍足球
2026-01-12 07:24:06
廣西又有2名干部向紀(jì)委投案自首!

廣西又有2名干部向紀(jì)委投案自首!

嶺南美玉
2026-01-12 00:08:15
我只認(rèn)出了萬梓良 ,你們呢 ?

我只認(rèn)出了萬梓良 ,你們呢 ?

小椰的奶奶
2026-01-12 01:45:27
為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

阿龍聊軍事
2026-01-09 20:20:47
伊朗政府宣布全國哀悼三天

伊朗政府宣布全國哀悼三天

界面新聞
2026-01-12 07:03:21
沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

另子維愛讀史
2025-12-08 20:58:22
汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

調(diào)侃國際觀點(diǎn)
2026-01-11 18:41:24
2026-01-12 08:04:49
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國的差距也許還在拉大”

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國足形勢:末輪不負(fù)泰國即確保晉級(jí)

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

外賣平臺(tái)"燒錢搶存量市場"迎來終局?

汽車要聞

2026款宋Pro DM-i長續(xù)航補(bǔ)貼后9.98萬起

態(tài)度原創(chuàng)

教育
健康
房產(chǎn)
本地
公開課

教育要聞

1分鐘說清!山西工程科技職業(yè)大學(xué)專業(yè)錄取線

這些新療法,讓化療不再那么痛苦

房產(chǎn)要聞

66萬方!4755套!三亞巨量房源正瘋狂砸出!

本地新聞

云游內(nèi)蒙|“包”你再來?一座在硬核里釀出詩意的城

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版