溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

帶你了解python鴨子類型的相關(guān)原理

發(fā)布時間:2020-10-28 18:49:46 來源:億速云 閱讀:283 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了帶你了解python鴨子類型的相關(guān)原理,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

首先Python不支持多態(tài),也不用支持多態(tài),python是一種多態(tài)語言,崇尚鴨子類型。

在程序設(shè)計中,鴨子類型(英語:duck typing)是動態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。這個概念的名字來源于由James Whitcomb Riley提出的鴨子測試,

“鴨子測試”可以這樣表述:

“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”

在鴨子類型中,關(guān)注的不是對象的類型本身,而是它是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個函數(shù),它接受一個類型為鴨的對象,并調(diào)用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函數(shù)可以接受一個任意類型的對象,并調(diào)用它的走和叫方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個運行時錯誤。任何擁有這樣的正確的走和叫方法的對象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。

鴨子類型通常得益于不測試方法和函數(shù)中參數(shù)的類型,而是依賴文檔、清晰的代碼和測試來確保正確使用。從靜態(tài)類型語言轉(zhuǎn)向動態(tài)類型語言的用戶通常試圖添加一些靜態(tài)的(在運行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,并約束了語言的動態(tài)特性。

-------------------------------------------

毫無疑問在python中對象也是一塊內(nèi)存,內(nèi)存中除了包含屬性、方法之外,還包含了對象得類型,我們通過引用來訪問對象,比如a=A(),首先python創(chuàng)建一個對象A,然后聲明一個變量a,再將變量a與對象A聯(lián)系起來。變量a是沒有類型得,它的類型取決于其關(guān)聯(lián)的對象。a=A()時,a是一個A類型的引用,我們可以說a是A類型的,如果再將a賦值3,a=3,此時a就是一個整型的引用,但python并不是弱類型語言,在python中'2'+3會報錯,而在php中'2'+3會得到5??梢赃@么理解,在python中變量類似與c中的指針,和c不同的是python中的變量可以指向任何類型,雖然這么說不太準(zhǔn)確,但是理解起來容易點。

因此,在python運行過程中,參數(shù)被傳遞過來之前并不知道參數(shù)的類型,雖然python中的方法也是后期綁定,但是和java中多態(tài)的后期綁定卻是不同的,java中的后期綁定至少知道對象的類型,而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就是一個A類型的變量,f沒有prt方法,所以f不是A類型的變量。

以上是從java的角度分析的,其實上邊都是一派胡言,只是為了說明python中的運行方法。沒有誰規(guī)定test方法是接收的參數(shù)是什么類型的。test方法只規(guī)定,接收一個參數(shù),調(diào)用這個參數(shù)的prt方法。在運行的時候如果這個參數(shù)有prt方法,python就執(zhí)行,如果沒有,python就報錯,因為abcde都有prt方法,而f沒有,所以得到了上邊得結(jié)果,這就是python的運行方式。

從學(xué)python有3個月了,雖然以前沒有怎么好好學(xué)習(xí)過java,但是java方面的書看了不少很多思維方式都轉(zhuǎn)變不過來,總是想用java的思維方式來思考python的問題,實際上那樣只會南轅北轍,python中有太多的東西和java不一樣,從里到外的不一樣。

上述內(nèi)容就是帶你了解python鴨子類型的相關(guān)原理,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI