在多數(shù)面向?qū)ο蠼滩闹校鄳B(tài)(Polymorphism)與封裝、繼承并稱為面向?qū)ο蟮娜筇匦浴H欢琍ython 對(duì)多態(tài)這一概念有著不同的理解與實(shí)現(xiàn)路徑。
在 Python 中,多態(tài)并不是對(duì)象的固有屬性,而是運(yùn)行時(shí)調(diào)用成功的結(jié)果。
5.1 傳統(tǒng)多態(tài):基于類型分派
在經(jīng)典面向?qū)ο篌w系中,多態(tài)建立在類型分派機(jī)制之上:
animal.speak(); // 運(yùn)行時(shí)動(dòng)態(tài)分派到 Dog.speak()這里多態(tài)成立,依賴于以下事實(shí):
? Dog 是 Animal 的子類型
? speak 在 Animal 接口中被聲明
? 調(diào)用在編譯期已被類型系統(tǒng)確認(rèn)合法
在這種模型中,多態(tài)是類型系統(tǒng)的能力,調(diào)用點(diǎn)只是執(zhí)行既定的類型規(guī)則。
對(duì)象“能做什么”,在進(jìn)入運(yùn)行期之前,已被類型關(guān)系嚴(yán)格限定。
5.2 Python 的多態(tài):基于調(diào)用成功
Python 采用了完全不同的路徑:
return x.read() # 不關(guān)心 x 的類型,只關(guān)心能否調(diào)用 read()只要對(duì)象在運(yùn)行時(shí)能夠響應(yīng) .read(),多態(tài)就成立:
process(NetworkStream()) # 示例:任意提供 read() 的對(duì)象Python 不要求對(duì)象繼承自特定基類,不要求顯式聲明接口。
Python 只關(guān)心一個(gè)事實(shí):這次調(diào)用,在運(yùn)行時(shí)是否成功。
因此,在 Python 中,多態(tài)不是“類型允許的可能性”,而是“調(diào)用成功的現(xiàn)實(shí)”。
5.3 調(diào)用點(diǎn)決定多態(tài)語義
一個(gè)關(guān)鍵但常被忽略的事實(shí)是:多態(tài)語義由“調(diào)用點(diǎn) + 對(duì)象”共同決定。
use_as_context(file_obj) # 上下文管理器角色從上述示例可以看出,對(duì)象本身并未改變,但調(diào)用點(diǎn)對(duì)對(duì)象的期待不同,多態(tài)語義也隨之變化。
這意味著,在 Python 中,對(duì)象并不“攜帶多態(tài)”,多態(tài)發(fā)生在具體的調(diào)用表達(dá)式處。
5.4 同一調(diào)用,不同對(duì)象
多態(tài)最直觀的體現(xiàn)是,同一調(diào)用形式,對(duì)不同對(duì)象產(chǎn)生合理效果。
print("hello".__len__()) # 直接調(diào)用魔術(shù)方法這種統(tǒng)一性并非來自共享類型體系,而是因?yàn)檫@些對(duì)象都實(shí)現(xiàn)了 __len__ 方法,調(diào)用點(diǎn)只關(guān)心“能否響應(yīng)這次調(diào)用”。
這正是 Python 多態(tài)的運(yùn)行時(shí)本質(zhì):
行為基于實(shí)際能力,而非類型聲明。
5.5 多態(tài)與接口穩(wěn)定性
既然多態(tài)依賴調(diào)用成功,接口穩(wěn)定性就來自使用約定,而非類型約束。
self._update_data()在 Python 中,接口穩(wěn)定取決于調(diào)用點(diǎn)長期依賴哪些屬性以及這些屬性的語義是否一致。
只要滿足:
? 調(diào)用形式不變
? 屬性名稱不變
? 語義承諾不變
那么多態(tài)就能持續(xù)成立,無論實(shí)現(xiàn)如何演化。
5.6 運(yùn)行時(shí)多態(tài)的優(yōu)勢(shì)
由于多態(tài)發(fā)生在運(yùn)行時(shí),Python 支持更加靈活的接口組合與演進(jìn)方式:
return self.legacy.old_method()這種方式支持:
? 靈活適配:兼容不同接口風(fēng)格
? 漸進(jìn)演進(jìn):新舊實(shí)現(xiàn)共存
? 低耦合:減少類型依賴
小結(jié)
在 Python 中,多態(tài)不是類型體系的產(chǎn)物,而是調(diào)用語義的結(jié)果。對(duì)象是否參與多態(tài),不取決于它“是什么”,而取決于它在某個(gè)調(diào)用點(diǎn)上“能否被這樣使用”。多態(tài)因此成為一種運(yùn)行時(shí)事實(shí),而非設(shè)計(jì)時(shí)承諾。
![]()
“點(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.