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

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Python OOP 設(shè)計思想 09:協(xié)議優(yōu)于繼承

0
分享至

多態(tài)、接口穩(wěn)定性和可替換性,更多依賴協(xié)議而非繼承體系。協(xié)議是 Python 面向?qū)ο笤O(shè)計的核心支撐機(jī)制,其理念源自動態(tài)行為約定,而非形式化類型層級。

9.1 協(xié)議的本質(zhì)含義

協(xié)議(Protocol)在 Python 中,是一組行為約定。

process_data(MemoryBuffer())

上述示例刻意避免任何共同基類或類型聲明,其目的在于強(qiáng)調(diào):協(xié)議不是類型結(jié)構(gòu),而是調(diào)用方在特定語境中的行為假設(shè)。

process_data() 并未詢問 source 是什么類型,也不關(guān)心它來自哪個繼承體系,而只是提出一個最小要求:對象必須提供 read() 行為。

只要這一行為在調(diào)用點成立,對象就被視為“符合協(xié)議”。

在這一模型中,接口的邊界由調(diào)用方定義,而不是由實現(xiàn)方預(yù)先聲明。

協(xié)議因此成為一種以使用為中心的接口觀,而非以類型為中心的設(shè)計。

協(xié)議的關(guān)鍵特征:

? 無需顯式聲明

? 基于行為而非身份

? 支持靈活替換與演化

9.2 鴨子類型的協(xié)議實踐

鴨子類型是協(xié)議思想在 Python 中最直觀的表現(xiàn)形式。

make_quack(Person())      # "I'm pretending to be a duck!"

在上述示例中,make_quack() 對“什么是鴨子”并無任何類型判斷,它只隱含一個約定:能 quack 的就是鴨子。

這一約定既不需要繼承,也不需要顯式聲明,而是在調(diào)用發(fā)生時即時驗證。

這種設(shè)計方式的關(guān)鍵不在于“是否安全”,而在于將接口判斷推遲到使用現(xiàn)場。

對象是否合格,不由其身份決定,而由其在該語境中的行為表現(xiàn)決定。

鴨子類型并不是放棄接口,而是將接口從類型系統(tǒng)中解放出來。

鴨子類型的價值在于:

? 最大化實現(xiàn)自由度:對象可以來自任何類型體系

? 降低接口耦合:無需復(fù)雜的繼承層次

? 自然支持演化:新類型可以輕松加入

9.3 非顯式接口的力量

在靜態(tài)語言中,接口通常是顯式聲明的類型結(jié)構(gòu)。而在 Python 中,接口的力量往往來自非顯式協(xié)議。

use_resource(FileHandler())

上下文管理器示例展示了一類典型的 Python 協(xié)議:由語法觸發(fā)的隱式接口。

with resource: 并不要求 resource 繼承自某個基類,它只假定對象能夠響應(yīng) __enter__() 與 __exit__()。這一假定完全由語言語法提出,而非由類型系統(tǒng)強(qiáng)制。

這種接口的力量在于:

? 接口由使用方式定義

? 實現(xiàn)只需對使用作出回應(yīng)

? 新對象可以在不修改任何既有代碼的前提下加入系統(tǒng)

接口因此不再是靜態(tài)聲明,而是語言行為的一部分。

9.4 協(xié)議與接口穩(wěn)定性

雖然協(xié)議是動態(tài)的,但接口穩(wěn)定性仍然可以得到保障。

process_items(CustomContainer())

迭代協(xié)議示例表明:接口穩(wěn)定性并不依賴?yán)^承結(jié)構(gòu),而依賴使用約定的長期一致性。

for item in container: 只提出一個要求:對象必須是可迭代的。

這一要求在 Python 中已經(jīng)高度穩(wěn)定,其穩(wěn)定性來自語言層面的共識,而非某個抽象父類。

不同容器實現(xiàn)可以自由演化其內(nèi)部結(jié)構(gòu),只要持續(xù)滿足迭代協(xié)議,調(diào)用方代碼就無需改變。這使得接口穩(wěn)定性建立在行為約定之上,而不是建立在類型凍結(jié)之上。

協(xié)議的優(yōu)勢在于:

? 允許對象自由演化

? 提供最小且穩(wěn)定的多態(tài)契約

? 避免繼承帶來的隱性耦合

9.5 typing.Protocol 的靜態(tài)支持

從 Python 3.8 開始,標(biāo)準(zhǔn)庫提供了 typing.Protocol,在靜態(tài)類型檢查中顯式支持協(xié)議概念。

read_all(open("file.txt", "rb"))    # 文件對象同樣符合 Readable 協(xié)議

typing.Protocol 的引入,并不是為了改變 Python 的運行時多態(tài)模型,而是為已經(jīng)存在的協(xié)議式設(shè)計補(bǔ)充一種“可被理解與檢查的語言”。

在沒有 typing.Protocol 之前,鴨子類型完全依賴約定:

對象是否“可用”,只能通過運行時調(diào)用來驗證。這種方式對動態(tài)系統(tǒng)極其友好,但對大型代碼庫而言,接口邊界往往只能存在于文檔或經(jīng)驗中。

typing.Protocol 的出現(xiàn),解決的正是這一層問題:

? 它不要求實現(xiàn)類繼承任何父類

? 它不參與 MRO,也不影響運行時行為

? 它不會改變 Python 的“行為優(yōu)先”立場

相反,typing.Protocol 做的事情非??酥?,它只是把“在此使用語境中,被假定存在的行為”顯式表達(dá)出來。

    def close(self) -> None: ...

這里的 Readable 并不是“誰是誰的子類”,而是對調(diào)用方的一種聲明:凡是被當(dāng)作 Readable 使用的對象,調(diào)用點將依賴這些行為。

這使得接口第一次具備了三重可見性:

? 對閱讀代碼的人:明確依賴的最小能力集合

? 對靜態(tài)檢查器:可驗證的行為邊界

? 對實現(xiàn)者:無需繼承、無需注冊、只需履約

因此,typing.Protocol 并不是“另一種接口類”,而是對鴨子類型的形式化補(bǔ)充,它讓協(xié)議從“隱含共識”上升為“可表達(dá)但不具約束力的契約”。

這也正是 Python 的一貫立場:接口用于說明與協(xié)作,而不是用于限制與管控。

9.6 魔術(shù)方法與運算符重載接口

在 Python 中,魔術(shù)方法(dunder methods)并不是“語言技巧”,而是一類由語法與運算符觸發(fā)的隱式接口。這些接口并非通過繼承聲明,而是通過使用方式自然成立。

當(dāng)代碼出現(xiàn)如下表達(dá)式時:

a + b

調(diào)用方并未關(guān)心 a 的類型層級,而只是隱式提出了一個接口需求:

? 對象是否支持 __add__()

? 運算結(jié)果是否具有合理語義

        

只要對象對該使用場景作出正確響應(yīng),它就自然滿足了“加法接口”。

同樣的機(jī)制適用于:

? __len__() → len(obj)

? __getitem__() → obj[index]

? __eq__() → obj1 == obj2

? __call__() → obj()

這些接口并非通過顯式聲明“被實現(xiàn)”,而是在語法使用中被調(diào)用、被驗證、被確認(rèn)。

運算符重載的本質(zhì)并不是擴(kuò)展語法能力,而是讓對象融入既有的使用語言。對象通過響應(yīng)這些魔術(shù)方法,主動適配調(diào)用方的表達(dá)方式,而不是要求調(diào)用方理解其內(nèi)部結(jié)構(gòu)。

這再次印證了 Python 的接口哲學(xué):接口不是通過繼承體系獲得的身份,而是通過使用行為達(dá)成的協(xié)作關(guān)系。

小結(jié)

在 Python 中,接口并不源自繼承結(jié)構(gòu),而源自使用語境中的行為約定。協(xié)議通過最小行為集定義可替換性,使對象在不共享類型身份的前提下協(xié)作。鴨子類型、魔術(shù)方法與 typing.Protocol 共同構(gòu)成了這一體系:接口由使用提出,由行為驗證,而非由繼承賦權(quán)。這種設(shè)計使系統(tǒng)在演化中保持靈活、穩(wěn)定且低耦合。


點贊有美意,贊賞是鼓勵

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(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)推薦
熱點推薦
再這么搞下去,中產(chǎn)家長們的崩塌就是早晚的事

再這么搞下去,中產(chǎn)家長們的崩塌就是早晚的事

重遠(yuǎn)投資觀
2026-01-10 20:55:25
皇馬的痛!19歲恩德里克獲8.2分+MVP:首秀一劍封喉,助法甲勁旅晉級

皇馬的痛!19歲恩德里克獲8.2分+MVP:首秀一劍封喉,助法甲勁旅晉級

側(cè)身凌空斬
2026-01-12 05:57:37
怒了!許利民:球員在擺譜、擺大牌,我們輸?shù)氖潜本┑男蜗蠛妥饑?yán)

怒了!許利民:球員在擺譜、擺大牌,我們輸?shù)氖潜本┑男蜗蠛妥饑?yán)

懂球帝
2026-01-11 22:54:27
這個東南亞小國從不避孕,人口已經(jīng)過億,是全球最開放的國家

這個東南亞小國從不避孕,人口已經(jīng)過億,是全球最開放的國家

犀利辣椒
2026-01-11 06:40:29
老板大氣!蘇州一工廠給員工發(fā)年終獎,按工齡1年1000,上不封頂

老板大氣!蘇州一工廠給員工發(fā)年終獎,按工齡1年1000,上不封頂

火山詩話
2026-01-12 06:54:34
合川千人赴約殺豬飯后續(xù):女子闖大禍,原地嚇呆,文旅連夜下場

合川千人赴約殺豬飯后續(xù):女子闖大禍,原地嚇呆,文旅連夜下場

鋭娛之樂
2026-01-11 22:06:10
閆學(xué)晶事件升級!多家官媒怒批后,又一壞消息傳來,這下麻煩大了

閆學(xué)晶事件升級!多家官媒怒批后,又一壞消息傳來,這下麻煩大了

天天熱點見聞
2026-01-11 08:37:35
U23國足首勝!媒體人熱議:茍著踢有道理,邵佳一多挑幾個吧

U23國足首勝!媒體人熱議:茍著踢有道理,邵佳一多挑幾個吧

奧拜爾
2026-01-11 21:37:55
家中老人突然離世!與保姆分房睡時摔倒,家屬怒告!深圳法院:不用賠

家中老人突然離世!與保姆分房睡時摔倒,家屬怒告!深圳法院:不用賠

南方都市報
2026-01-11 20:52:48
馬斯克:X平臺將于一周內(nèi)開源新算法

馬斯克:X平臺將于一周內(nèi)開源新算法

界面新聞
2026-01-11 10:30:09
王毅同索馬里外長德埃電話會談

王毅同索馬里外長德埃電話會談

界面新聞
2026-01-11 18:49:08
燒光500億的“中國寶馬”,引爆2026年第一顆雷

燒光500億的“中國寶馬”,引爆2026年第一顆雷

金錯刀
2026-01-10 20:09:00
格陵蘭島普通百姓:囤糧、存錢,努力保持冷靜,本以為美國是盟友,不料竟成其獵物

格陵蘭島普通百姓:囤糧、存錢,努力保持冷靜,本以為美國是盟友,不料竟成其獵物

紅星新聞
2026-01-11 17:33:21
澳大利亞U23主帥:下半場只有一支球隊在進(jìn)攻;中國隊防守嚴(yán)密

澳大利亞U23主帥:下半場只有一支球隊在進(jìn)攻;中國隊防守嚴(yán)密

懂球帝
2026-01-11 22:32:26
瑞典軍工發(fā)布導(dǎo)彈視頻:1枚導(dǎo)彈命中摧毀中國052d型驅(qū)逐艦!

瑞典軍工發(fā)布導(dǎo)彈視頻:1枚導(dǎo)彈命中摧毀中國052d型驅(qū)逐艦!

達(dá)文西看世界
2026-01-11 19:10:20
個人所得稅減半征收政策!延續(xù)至2027年12月31日!

個人所得稅減半征收政策!延續(xù)至2027年12月31日!

審計之家
2026-01-11 09:03:14
輸球又輸人!皇馬決賽最慘之人:阿隆索親手將他打入冷宮

輸球又輸人!皇馬決賽最慘之人:阿隆索親手將他打入冷宮

瀾歸序
2026-01-12 05:35:15
荒誕!反向騙取電詐團(tuán)伙1800元,不但無功,竟然還得坐牢?!

荒誕!反向騙取電詐團(tuán)伙1800元,不但無功,竟然還得坐牢?!

阿陸
2026-01-11 15:27:57
霍啟剛主動公開個人財產(chǎn):35套物業(yè)曝光,遍及港澳、內(nèi)地與法、英,多項房產(chǎn)與郭晶晶共同持有

霍啟剛主動公開個人財產(chǎn):35套物業(yè)曝光,遍及港澳、內(nèi)地與法、英,多項房產(chǎn)與郭晶晶共同持有

大象新聞
2026-01-12 00:17:04
以色列在行動,伊朗導(dǎo)彈部隊指揮官遭刺殺,庫爾德武裝發(fā)起進(jìn)攻

以色列在行動,伊朗導(dǎo)彈部隊指揮官遭刺殺,庫爾德武裝發(fā)起進(jìn)攻

史政先鋒
2026-01-11 15:58:18
2026-01-12 08:12: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ù)泰國即確保晉級

娛樂要聞

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

財經(jīng)要聞

外賣平臺"燒錢搶存量市場"迎來終局?

汽車要聞

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

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

教育
游戲
房產(chǎn)
數(shù)碼
軍事航空

教育要聞

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

這款帥到掉渣的GBA神作《洛克人ZERO》,被模仿無數(shù)次仍是巔峰

房產(chǎn)要聞

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

數(shù)碼要聞

科技有AI,連接全球:海信家電參展CES 2026,定義智慧生活新圖景

軍事要聞

俄大使:馬杜羅夫婦被控制時身邊沒人

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