通過案例解析python鴨子類型相關(guān)原理
首先Python不支持多態(tài),也不用支持多態(tài),python是一種多態(tài)語言,崇尚鴨子類型。
在程序設(shè)計(jì)中,鴨子類型(英語:duck typing)是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。這個(gè)概念的名字來源于由James Whitcomb Riley提出的鴨子測(cè)試,
“鴨子測(cè)試”可以這樣表述:
“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”
在鴨子類型中,關(guān)注的不是對(duì)象的類型本身,而是它是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個(gè)函數(shù),它接受一個(gè)類型為鴨的對(duì)象,并調(diào)用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個(gè)函數(shù)可以接受一個(gè)任意類型的對(duì)象,并調(diào)用它的走和叫方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。任何擁有這樣的正確的走和叫方法的對(duì)象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。
鴨子類型通常得益于不測(cè)試方法和函數(shù)中參數(shù)的類型,而是依賴文檔、清晰的代碼和測(cè)試來確保正確使用。從靜態(tài)類型語言轉(zhuǎn)向動(dòng)態(tài)類型語言的用戶通常試圖添加一些靜態(tài)的(在運(yùn)行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,并約束了語言的動(dòng)態(tài)特性。
-------------------------------------------
毫無疑問在python中對(duì)象也是一塊內(nèi)存,內(nèi)存中除了包含屬性、方法之外,還包含了對(duì)象得類型,我們通過引用來訪問對(duì)象,比如a=A(),首先python創(chuàng)建一個(gè)對(duì)象A,然后聲明一個(gè)變量a,再將變量a與對(duì)象A聯(lián)系起來。變量a是沒有類型得,它的類型取決于其關(guān)聯(lián)的對(duì)象。a=A()時(shí),a是一個(gè)A類型的引用,我們可以說a是A類型的,如果再將a賦值3,a=3,此時(shí)a就是一個(gè)整型的引用,但python并不是弱類型語言,在python中'2'+3會(huì)報(bào)錯(cuò),而在php中'2'+3會(huì)得到5。可以這么理解,在python中變量類似與c中的指針,和c不同的是python中的變量可以指向任何類型,雖然這么說不太準(zhǔn)確,但是理解起來容易點(diǎn)。
因此,在python運(yùn)行過程中,參數(shù)被傳遞過來之前并不知道參數(shù)的類型,雖然python中的方法也是后期綁定,但是和java中多態(tài)的后期綁定卻是不同的,java中的后期綁定至少知道對(duì)象的類型,而python中就不知道參數(shù)的類型。
還引用上次的例子:
class A: def prt(self): print "A" class B(A): def prt(self): print "B" class C(A): def prt(self): print "C" class D(A): pass class E: def prt(self): print "E" class F: pass def test(arg): arg.prt() a = A() b = B() c = C() d = D() e = E() f = F() test(a) test(b) test(c) test(d) test(e) test(f)
輸出結(jié)果:
A B C A E Traceback (most recent call last): File "/Users/shikefu678/Documents/Aptana Studio 3 Workspace/demo/demo.py", line 33, in <module> test(a),test(b),test(c),test(d),test(e),test(f) File "/Users/shikefu678/Documents/Aptana Studio 3 Workspace/demo/demo.py", line 24, in test arg.prt() AttributeError: F instance has no attribute 'prt'
a,b,c,d都是A類型的變量,所以可以得到預(yù)期的效果(從java角度的預(yù)期),e并不是A類型的變量但是根據(jù)鴨子類型,走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子,e有prt方法,所以在test方法中e就是一個(gè)A類型的變量,f沒有prt方法,所以f不是A類型的變量。
以上是從java的角度分析的,其實(shí)上邊都是一派胡言,只是為了說明python中的運(yùn)行方法。沒有誰規(guī)定test方法是接收的參數(shù)是什么類型的。test方法只規(guī)定,接收一個(gè)參數(shù),調(diào)用這個(gè)參數(shù)的prt方法。在運(yùn)行的時(shí)候如果這個(gè)參數(shù)有prt方法,python就執(zhí)行,如果沒有,python就報(bào)錯(cuò),因?yàn)閍bcde都有prt方法,而f沒有,所以得到了上邊得結(jié)果,這就是python的運(yùn)行方式。
從學(xué)python有3個(gè)月了,雖然以前沒有怎么好好學(xué)習(xí)過java,但是java方面的書看了不少很多思維方式都轉(zhuǎn)變不過來,總是想用java的思維方式來思考python的問題,實(shí)際上那樣只會(huì)南轅北轍,python中有太多的東西和java不一樣,從里到外的不一樣。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用Python連接Oracle數(shù)據(jù)庫的基本操作指南
由于之前的在職的公司沒有機(jī)會(huì)接觸到Oralce數(shù)據(jù)庫,所以就沒有用python連接過Oralce,之前大多集中在連接mysql和sql server,最近在做一下web自動(dòng)化的工作,所以簡(jiǎn)單的記錄一下,下面這篇文章主要給大家介紹了關(guān)于利用Python連接Oracle數(shù)據(jù)庫的基本操作,需要的朋友可以參考下2022-06-06Python 使用 PyQt5 開發(fā)的關(guān)機(jī)小工具分享
這篇文章主要介紹了Python 使用 PyQt5 開發(fā)的關(guān)機(jī)小工具分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python進(jìn)程間通信multiprocess代碼實(shí)例
這篇文章主要介紹了Python進(jìn)程間通信multiprocess代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03何用Python實(shí)現(xiàn)一個(gè) “系統(tǒng)聲音” 的實(shí)時(shí)律動(dòng)掛件
這篇文章將給大家介紹了如何用 Python 實(shí)現(xiàn)一個(gè) “系統(tǒng)聲音” 的實(shí)時(shí)律動(dòng)掛件,采集后直接實(shí)時(shí)地在電腦上繪制波形動(dòng)畫,主要是用來作為 FL Studio 播放時(shí)的一個(gè)桌面小掛件,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01余弦相似性計(jì)算及python代碼實(shí)現(xiàn)過程解析
這篇文章主要介紹了余弦相似性計(jì)算及python代碼實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Python?OpenCV識(shí)別行人入口進(jìn)出人數(shù)統(tǒng)計(jì)
本文主要介紹了Python?OpenCV識(shí)別行人入口進(jìn)出人數(shù)統(tǒng)計(jì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-01-01Python類的定義、繼承及類對(duì)象使用方法簡(jiǎn)明教程
這篇文章主要介紹了Python類的定義、繼承及類對(duì)象使用方法簡(jiǎn)明教程,本文用淺顯易懂的語言講解了類的定義、繼承及類對(duì)象的使用,非常實(shí)用易懂,需要的朋友可以參考下2015-05-05