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

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

Python:里氏替換原則(LSP)

0
分享至

里氏替換原則(Liskov Substitution Principle, 簡(jiǎn)稱(chēng) LSP)是面向?qū)ο笤O(shè)計(jì)(OOD)與 SOLID 原則中的重要組成部分,由 Barbara Liskov 在 1987 年提出。它是繼承體系設(shè)計(jì)的根本規(guī)范,決定了父類(lèi)與子類(lèi)之間是否真正具有“可替換性”。

簡(jiǎn)而言之:

只要父類(lèi)可以使用的地方,子類(lèi)也必須能夠安全地替代父類(lèi),而不會(huì)破壞程序功能。

LSP 是保證繼承層次結(jié)構(gòu)穩(wěn)定、可維護(hù)、可擴(kuò)展的基礎(chǔ)。如果 LSP 被破壞,繼承就會(huì)帶來(lái)更多問(wèn)題而非好處。

一、為什么需要里氏替換原則?

繼承本質(zhì)上表達(dá)“是一種”(is-a)關(guān)系,例如:

? Dog 是一種 Animal

? SavingsAccount 是一種 Account

? AdminUser 是一種 User

然而,不正確的繼承會(huì)導(dǎo)致:

? 子類(lèi)行為違背父類(lèi)預(yù)期

? 子類(lèi)重寫(xiě)方法改變語(yǔ)義

? 程序運(yùn)行時(shí)出錯(cuò)或表現(xiàn)異常

? 繼承層次難以維護(hù)或擴(kuò)展

LSP 的意義就是確保繼承結(jié)構(gòu)的正確性,使子類(lèi)是真正的父類(lèi)擴(kuò)展,而不是破壞父類(lèi)。

二、里氏替換原則的形式化定義

Barbara Liskov 給出的經(jīng)典定義:

如果 S 是 T 的子類(lèi)型,那么類(lèi)型 T 的對(duì)象可以被類(lèi)型 S 的對(duì)象替換,而不會(huì)改變程序的正確性。

換句話說(shuō):

? 子類(lèi)必須遵守父類(lèi)規(guī)定的行為契約

? 子類(lèi)不能削弱父類(lèi)的行為

? 子類(lèi)可以擴(kuò)展功能,但不能改變父類(lèi)的語(yǔ)義

這是一種行為約束(Behavioral Subtyping)。

想象一下,你平時(shí)用的插座都是標(biāo)準(zhǔn)的三孔插座。如果某個(gè)電器插頭改變了尺寸或形狀,即便是同類(lèi)型的電器,也可能無(wú)法直接插入使用。

里氏替換原則就像“標(biāo)準(zhǔn)插頭規(guī)范”:任何子類(lèi)都必須遵守父類(lèi)定義的接口和行為規(guī)范,才能在父類(lèi)能工作的場(chǎng)景中無(wú)縫替換使用。

遵循 LSP,繼承就像標(biāo)準(zhǔn)插座一樣穩(wěn)健可靠,子類(lèi)可以擴(kuò)展功能,但不能破壞已有“兼容性”。

三、Python 與 LSP 的關(guān)系

Python 是動(dòng)態(tài)語(yǔ)言,沒(méi)有強(qiáng)制類(lèi)型檢查,因此:

? Python 不會(huì)阻止違反 LSP 的繼承

? 行為契約完全依賴(lài)開(kāi)發(fā)者自己遵守

? 違反 LSP 在運(yùn)行期才會(huì)暴露問(wèn)題(例如 AttributeError, TypeError, Logic Bug 等)

因此在 Python 中更需遵循 LSP 來(lái)構(gòu)建健壯的類(lèi)體系。

(1)經(jīng)典的違反 LSP 的例子

方形“繼承”矩形:

        self.w = self.h = h

表面上 “方形是一種矩形”,但行為上的契約并不一致:

test(Square(2, 2))       # → 行為完全改變!輸出 25

父類(lèi) Rectangle 的隱含契約:

# 結(jié)果:面積 = 4 * 5 = 20

子類(lèi) Square 破壞了這一契約:

# 結(jié)果:面積 = 5 * 5 = 25 (不是預(yù)期的20)

Square 改變了父類(lèi) Rectangle 的關(guān)鍵行為契約(寬高修改的獨(dú)立性),導(dǎo)致在需要 Rectangle 的場(chǎng)景中無(wú)法正確替換 Rectangle,從而違反了 LSP。

(2)正確的設(shè)計(jì)方式

將 Rectangle 與 Square 設(shè)計(jì)為并列關(guān)系,繼承抽象類(lèi) Shape:

        return self.side * self.side

二者都是 Shape,且不互為子類(lèi),因此不會(huì)互相破壞契約。

這是工業(yè)界最常采用且最安全的設(shè)計(jì)。

四、Python 中違反 LSP 的常見(jiàn)場(chǎng)景

(1)子類(lèi)重寫(xiě)方法,但改變了父類(lèi)語(yǔ)義,即子類(lèi)方法的行為與父類(lèi)預(yù)期不一致

        print(text)

改進(jìn):創(chuàng)建 Writer 抽象基類(lèi);不要讓 ConsoleWriter 繼承具體實(shí)現(xiàn)類(lèi)。

(2)子類(lèi)增加方法參數(shù),導(dǎo)致不能替代父類(lèi)

        print("汪" * volume)

改進(jìn):保持參數(shù)一致,或另加方法。

(3)子類(lèi)限制更多條件,破壞父類(lèi)契約

            raise ValueError("VIP 不允許取太多?")

子類(lèi)不能比父類(lèi)更嚴(yán)格;必須遵守父類(lèi)契約。

五、遵守 LSP 的設(shè)計(jì)建議

(1)繼承只表達(dá)“is-a”關(guān)系

不要濫用繼承,將子類(lèi)設(shè)計(jì)成真正的父類(lèi)擴(kuò)展,而非簡(jiǎn)單重用代碼。

(2)子類(lèi)行為必須符合父類(lèi)預(yù)期語(yǔ)義

子類(lèi)方法的功能和行為應(yīng)與父類(lèi)保持一致,不可任意改變。

(3)輸入輸出保持兼容

子類(lèi)不能收緊父類(lèi)的輸入要求,也不能改變父類(lèi)的輸出預(yù)期。

(4)方法重寫(xiě)保持邏輯兼容

子類(lèi)重寫(xiě)方法時(shí),應(yīng)在不破壞父類(lèi)契約的前提下擴(kuò)展功能。

(5)優(yōu)先使用組合而非繼承

當(dāng)“有一個(gè)”(has-a)關(guān)系更合理時(shí),使用組合替代繼承,以提高靈活性和可維護(hù)性。

(6)使用抽象基類(lèi)定義行為契約

通過(guò) ABC(Abstract Base Class)明確方法接口和行為規(guī)范,確保子類(lèi)遵守契約。

(7)文檔與注釋明確規(guī)范

在文檔或代碼注釋中清晰描述方法行為,便于子類(lèi)開(kāi)發(fā)者理解并遵循父類(lèi)契約。

六、綜合示例:符合 LSP 的日志系統(tǒng)

process(FileLogger())     # OK

? FileLogger 與 ConsoleLogger 都遵守 Logger 的契約

? 任意一個(gè)都可以替代 Logger

? 真正符合 LSP

小結(jié)

里氏替換原則是繼承體系設(shè)計(jì)的基礎(chǔ),它要求子類(lèi)必須能夠完全替代父類(lèi),而不改變程序行為。遵守 LSP 能提升代碼穩(wěn)定性、可維護(hù)性和擴(kuò)展能力;違反 LSP 的繼承會(huì)導(dǎo)致隱藏 bug、錯(cuò)誤行為和脆弱的結(jié)構(gòu)。在 Python 中沒(méi)有編譯時(shí)強(qiáng)類(lèi)型約束,因此更應(yīng)通過(guò)約定、抽象基類(lèi)和清晰的設(shè)計(jì)來(lái)確保子類(lèi)遵守父類(lèi)行為契約。遵循 LSP 是編寫(xiě)健壯、可擴(kuò)展面向?qū)ο蟠a的重要前提。


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

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(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)推薦
記者在街頭采訪年輕人“年薪20萬(wàn)屬于什么水平”,得到的回答令人咋舌!

記者在街頭采訪年輕人“年薪20萬(wàn)屬于什么水平”,得到的回答令人咋舌!

張曉磊
2025-10-31 09:44:39
要求解放軍動(dòng)手,斬首賴(lài)清德,臺(tái)當(dāng)局下令報(bào)復(fù),館長(zhǎng)要被拿下?

要求解放軍動(dòng)手,斬首賴(lài)清德,臺(tái)當(dāng)局下令報(bào)復(fù),館長(zhǎng)要被拿下?

音樂(lè)時(shí)光的娛樂(lè)
2026-01-12 08:23:07
皇馬克星上線!巴薩真核拉菲尼亞主導(dǎo)超級(jí)杯決賽

皇馬克星上線!巴薩真核拉菲尼亞主導(dǎo)超級(jí)杯決賽

體壇周報(bào)
2026-01-12 09:17:13
伊朗政府宣布全國(guó)哀悼三天

伊朗政府宣布全國(guó)哀悼三天

界面新聞
2026-01-12 07:03:21
重返季后賽排名,山東男籃6連勝 于德豪5記三分 邱彪愛(ài)將輪番爆發(fā)

重返季后賽排名,山東男籃6連勝 于德豪5記三分 邱彪愛(ài)將輪番爆發(fā)

替補(bǔ)席看球
2026-01-11 21:40:49
艾滋病新增130萬(wàn)!很多人中招很冤枉!在外“5不碰”一定要記死

艾滋病新增130萬(wàn)!很多人中招很冤枉!在外“5不碰”一定要記死

今朝牛馬
2025-12-31 19:31:04
不服!澳洲將帥批U23國(guó)足:射1腳就進(jìn)+下半場(chǎng)龜縮 70年代丑陋踢法

不服!澳洲將帥批U23國(guó)足:射1腳就進(jìn)+下半場(chǎng)龜縮 70年代丑陋踢法

我愛(ài)英超
2026-01-11 22:39:22
中產(chǎn)涌入超市,搶300元羽絨服

中產(chǎn)涌入超市,搶300元羽絨服

中國(guó)新聞周刊
2026-01-09 22:13:04
布倫森26+6+8阿夫迪亞25+5 尼克斯終結(jié)開(kāi)拓者5連勝

布倫森26+6+8阿夫迪亞25+5 尼克斯終結(jié)開(kāi)拓者5連勝

北青網(wǎng)-北京青年報(bào)
2026-01-12 09:51:15
恭喜楊瀚森!中國(guó)歷史首人!姚明都沒(méi)能做到

恭喜楊瀚森!中國(guó)歷史首人!姚明都沒(méi)能做到

King迪哥侃球
2026-01-11 21:55:00
伊朗步入十字路口:抗議者焚燒革命衛(wèi)隊(duì)總部!撕毀哈梅內(nèi)伊肖像

伊朗步入十字路口:抗議者焚燒革命衛(wèi)隊(duì)總部!撕毀哈梅內(nèi)伊肖像

項(xiàng)鵬飛
2026-01-09 19:37:50
閆學(xué)晶事件升級(jí)!官媒批評(píng)毫不留情,趙家班多人受牽連,麻煩大了

閆學(xué)晶事件升級(jí)!官媒批評(píng)毫不留情,趙家班多人受牽連,麻煩大了

李健政觀察
2026-01-10 09:25:10
明搶5000萬(wàn)桶石油后,特朗普轉(zhuǎn)頭才發(fā)現(xiàn):中國(guó)連一桶都不肯買(mǎi)了?

明搶5000萬(wàn)桶石油后,特朗普轉(zhuǎn)頭才發(fā)現(xiàn):中國(guó)連一桶都不肯買(mǎi)了?

書(shū)紀(jì)文譚
2026-01-11 19:36:13
特朗普:正在考慮干預(yù)伊朗局勢(shì)的“強(qiáng)硬選項(xiàng)”

特朗普:正在考慮干預(yù)伊朗局勢(shì)的“強(qiáng)硬選項(xiàng)”

新京報(bào)政事兒
2026-01-12 09:47:51
年薪50萬(wàn)遭妻子嫌棄后續(xù):丈夫身份曝光,工資全上交,挨罵是日常

年薪50萬(wàn)遭妻子嫌棄后續(xù):丈夫身份曝光,工資全上交,挨罵是日常

單手搓核彈
2026-01-06 13:44:21
國(guó)乒四大主力全傷了!男隊(duì)無(wú)人可用全軍覆沒(méi),王皓爭(zhēng)議舉動(dòng)太落魄

國(guó)乒四大主力全傷了!男隊(duì)無(wú)人可用全軍覆沒(méi),王皓爭(zhēng)議舉動(dòng)太落魄

三十年萊斯特城球迷
2026-01-11 20:39:33
天妒英才!四川射箭小將鐘翔去世,年僅17歲,長(zhǎng)得帥氣剛拿省冠軍

天妒英才!四川射箭小將鐘翔去世,年僅17歲,長(zhǎng)得帥氣剛拿省冠軍

天天熱點(diǎn)見(jiàn)聞
2026-01-12 06:03:39
千人殺豬飯后續(xù),晚上呆呆哭了,無(wú)人幫她母親收拾,周?chē)荚谥辈?>
    </a>
        <h3>
      <a href=觀察鑒娛
2026-01-12 09:19:49
沉默4天后,大陸通知全世界,賴(lài)清德隨時(shí)可能被抓,鄭麗文懸了?

沉默4天后,大陸通知全世界,賴(lài)清德隨時(shí)可能被抓,鄭麗文懸了?

軒逸阿II
2026-01-11 00:43:40
卡友吐槽:1200公里有17個(gè)收費(fèi)站,內(nèi)蒙走國(guó)道比高速還費(fèi)錢(qián)

卡友吐槽:1200公里有17個(gè)收費(fèi)站,內(nèi)蒙走國(guó)道比高速還費(fèi)錢(qián)

商用車(chē)頭條
2026-01-11 07:03:58
2026-01-12 10:12:49
MediaTea
MediaTea
專(zhuān)業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

小米二手車(chē)價(jià)大跳水:SU7半年跌5萬(wàn)元

頭條要聞

牛彈琴:新的戰(zhàn)爭(zhēng)一觸即發(fā) 美國(guó)和以色列可能弄巧成拙

頭條要聞

牛彈琴:新的戰(zhàn)爭(zhēng)一觸即發(fā) 美國(guó)和以色列可能弄巧成拙

體育要聞

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

娛樂(lè)要聞

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

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

揭秘“穩(wěn)賺不賠”的代工項(xiàng)目騙局

汽車(chē)要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬(wàn)起

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

旅游
家居
教育
數(shù)碼
軍事航空

旅游要聞

貴州梅園,體驗(yàn)感更好了!

家居要聞

木色留白 演繹現(xiàn)代自由

教育要聞

學(xué)霸要怎么培養(yǎng)?我從管理的角度聊一聊!

數(shù)碼要聞

2025年中國(guó)電視出貨量創(chuàng)下16年新低 同比下滑8.5%

軍事要聞

俄大使:馬杜羅夫婦被控制時(shí)身邊沒(méi)人

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