首頁 >後端開發 >Python教學 >python中多態如何理解

python中多態如何理解

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼原創
2019-06-18 09:19:385827瀏覽

Python不支援多態,也不用支援多態,python是一種多態語言,崇尚鴨子類型。一個物件有效的語義,不是由繼承自特定的類別或實作特定的接口,而是由當前方法和屬性的集合決定。 python中多態如何理解

多態

是允許將父物件設定為和一個或多個它的子物件相等的技術,例如Parent:=Child; 多態性使得能夠利用同一類別(基類)類型的指標來引用不同類別的物件,以及根據所引用物件的不同,以不同的方式執行相同的操作。

相關推薦:《python影片教學

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)

输出结果

A
B
C
A
E
Traceback (most recent call last):
File "D:/Python/多态1.py", line 45, in <module>
test(f)
File "D:/Python/多态1.py", line 30, in test
arg.prt()
AttributeError: &#39;F&#39; object has no attribute &#39;prt&#39;
Process finished with exit code 1

乍一看似乎python支援多態,呼叫test(a),test(b),test(c ),test(d)時工作的很好,但是下邊就大不一樣了。
呼叫test(e)時,python只是呼叫e的prt方法,並沒有判斷e是否為A子類別的物件(事實上,定義test方法時也沒有指定參數的類型,python根本無法判斷)。
呼叫test(f)時報錯,原因很簡單,f沒有prt方法。

首先Python不支援多態,也不用支援多態,python是一種多態性語言,崇尚鴨子類型。以下是維基百科中對鴨子類型得論述:

在程式設計中,鴨子類型(英文:duck typing)是動態類型的一種風格。在這種風格中,一個物件有效的語義,不是由繼承自特定的類別或實作特定的接口,而是由當前方法和屬性的集合決定。這個概念的名字來自James Whitcomb Riley提出的鴨子測試,「鴨子測試」可以這樣表述:

「當看到一隻鳥走過來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。」

在鴨子類型中,關注的不是物件的類型本身,而是它是如何使用的。例如,
在不使用鴨子類型的語言中,我們可以寫一個函數,它接受一個類型為鴨的對象,並呼叫它的走和叫方法。
在使用鴨子類型的語言中,這樣的一個函數可以接受一個任意類型的對象,並呼叫它的走和叫方法。如果這些需要被呼叫的方法不存在,那麼將會引發一個運行時錯誤。任何擁有這樣的正確的走和叫方法的對像都可被函數接受的這種行為引出了以上表述,這種決定類型的方式因此得名。

鴨子類型通常得益於不測試方法和函數中參數的類型,而是依賴文件、清晰的程式碼和測試來確保正確使用。從靜態類型語言轉向動態類型語言的使用者通常試圖添加一些靜態的(在運行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,並約束了語言的動態特性。

毫無疑問在python中對像也是一塊內存,內存中除了包含屬性、方法之外,還包含了對象得類型,我們通過引用來訪問對象,比如a=A(),首先python建立一個物件A,然後宣告一個變數a,再將變數a與物件A連結起來。變數a是沒有類型得,它的型別取決於其關聯的物件。 a=A()時,a是A類型的引用,我們可以說a是A型的,如果再將a賦值3,a=3,此時a就是一個整數的引用,但python並不是弱類型語言,在python中'2' 3會報錯,而在PHP中'2' 3會得到5。可以這麼理解,在python中變數類似與c中的指針,和c不同的是python中的變數可以指向任何類型,雖然這麼說不太準確,但是理解起來容易點。
因此,在python運行過程中,參數被傳遞過來之前並不知道參數的類型,雖然python中的方法也是後期綁定,但是和Java中多態的後期綁定卻是不同的,java中的後製綁定至少知道物件的類型,而python中就不知道參數的類型。

test方法只規定,接收一個參數,呼叫這個參數的prt方法。在運行的時候如果這個參數有prt方法,python就執行,如果沒有,python就報錯,因為abcde都有prt方法,而f沒有,所以得到了上邊得結果,這就是python的運行方式。

以上是python中多態如何理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn