做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

詳細(xì)介紹Python的鴨子類型

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:26:33
文檔

詳細(xì)介紹Python的鴨子類型

詳細(xì)介紹Python的鴨子類型:相信python的開(kāi)發(fā)者對(duì)于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準(zhǔn)確定義是是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定。所以這篇文章給大家
推薦度:
導(dǎo)讀詳細(xì)介紹Python的鴨子類型:相信python的開(kāi)發(fā)者對(duì)于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準(zhǔn)確定義是是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定。所以這篇文章給大家

相信python的開(kāi)發(fā)者對(duì)于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準(zhǔn)確定義是‘是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定’。所以這篇文章給大家python的鴨子類型。

鴨子類型基本定義

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

以下是維基百科中對(duì)鴨子類型得論述:

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

“當(dāng)看到一只鳥(niǎo)走起來(lái)像鴨子、游泳起來(lái)像鴨子、叫起來(lái)也像鴨子,那么這只鳥(niǎo)就可以被稱為鴨子?!?br/>

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

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

python中的具體實(shí)現(xiàn)

下面的代碼就是一個(gè)簡(jiǎn)單的鴨子類型

class duck():
 def walk(self):
 print('I walk like a duck')
 def swim(self):
 print('i swim like a duck')

class person():
 def walk(self):
 print('this one walk like a duck') 
 def swim(self):
 print('this man swim like a duck')

對(duì)于一個(gè)鴨子類型來(lái)說(shuō),我們并不關(guān)心這個(gè)對(duì)象的類型本身或是這個(gè)類繼承,而是這個(gè)類是如何被使用的。我們可以通過(guò)下面的代碼來(lái)調(diào)用這些類的方法。

def watch_duck(animal):
 animal.walk()
 animal.swim()

small_duck = duck()
watch_duck(small_duck)

output >> 
I walk like a duck
i swim like a duck


duck_like_man = person()
watch_duck(duck_like_man)

output >> 
this one walk like a duck
this man swim like a duck


class Lame_Foot_Duck():
 def swim(self):
 print('i am lame but i can swim')

lame_duck = Lame_Foot_Duck()
watch_duck(lame_duck)

output >>
AttributeError: Lame_Foot_Duck instance has no attribute 'walk'

watch_duck函數(shù)接收這個(gè)類的對(duì)象,然后并沒(méi)有檢查對(duì)象的類型,而是直接調(diào)用這個(gè)對(duì)象的走和游的方法,如果所需要的方法不存在就報(bào)錯(cuò)。

具體在python中鴨子類型的體現(xiàn)如下面的代碼所示

class CollectionClass():
 lists = [1,2,3,4]
 def __getitem__(self, index):
 return self.lists[index]

iter_able_object = CollectionClass()

class Another_iterAbleClass():
 lists=[1,2,3,4]
 list_position = -1

 def __iter__(self):
 return self

 def next(self): #還有更簡(jiǎn)單的實(shí)現(xiàn),使用生成器或迭代器什么的:)
 self.list_position += 1
 if self.list_position >3:
 raise StopIteration
 return self.lists[self.list_position]

another_iterable_object=Another_iterAbleClass()

print(iter_able_object[1])
print(iter_able_object[1:3])
output>>
2
[2, 3]

another_iterable_object[2]
output>>
Traceback (most recent call last):
 File "/Users/steinliber/a.py", line 32, in <module>
 another_iterable_object[2]
TypeError: 'Another_iterAbleClass' object does not support indexing

print(next(another_iterable_object))
output>>
1
print(next(another_iterable_object))
output>>
2

print(next(iter_able_object))
output>>
Traceback (most recent call last):
 File "/Users/steinliber/a.py", line 29, in <module>
 print(next(iter_able_object))
TypeError: IterAbleClass object is not an iterator

在python把上述代碼的實(shí)現(xiàn)方法叫做protocol(協(xié)議),這些protocol可以看作是通知型的接口,它規(guī)定了調(diào)用方使用該功能要調(diào)用對(duì)象的哪些方法,被調(diào)用方要實(shí)現(xiàn)哪些方法才能完成這個(gè)功能。它和java中的接口區(qū)別在于java中的接口功能實(shí)現(xiàn)需要通過(guò)繼承,繼承的類必須實(shí)現(xiàn)接口中的所有的抽象方法,所以在Java中強(qiáng)調(diào)的是類型的概念,而python中的protocol更多的是通知性的,一個(gè)函數(shù)規(guī)定要實(shí)現(xiàn)某個(gè)功能需要調(diào)用傳入對(duì)象的哪些方法,所有實(shí)現(xiàn)這些方法的類就可以實(shí)現(xiàn)這個(gè)功能。

具體從上面兩個(gè)類來(lái)說(shuō),第一個(gè)類實(shí)現(xiàn)了__getitem__方法,那python的解釋器就會(huì)把它當(dāng)做一個(gè)collection,就可以在這個(gè)類的對(duì)象上使用切片,獲取子項(xiàng)等方法,第二個(gè)類實(shí)現(xiàn)了__iter__next方法,python就會(huì)認(rèn)為它是一個(gè)iterator,就可以在這個(gè)類的對(duì)象上通過(guò)循環(huán)來(lái)獲取各個(gè)子項(xiàng)。一個(gè)類可以實(shí)現(xiàn)它有能力實(shí)現(xiàn)的方法,并只能被用于在它有意義的情況下。

這兩個(gè)類和上面的鴨子類相比較,其實(shí)用于切邊的[](它其實(shí)調(diào)用的是python的slice函數(shù))和用于循環(huán)的iter()就相當(dāng)于watch_duck函數(shù),這些函數(shù)都接收任意類的對(duì)象,并調(diào)用實(shí)現(xiàn)功能所需要的對(duì)象中的方法來(lái)實(shí)現(xiàn)功能,若該函數(shù)中調(diào)用的方法對(duì)象里面不存在,就報(bào)錯(cuò)。

從上面可以看出,python鴨子類型的靈活性在于它關(guān)注的是這個(gè)所調(diào)用的對(duì)象是如何被使用的,而沒(méi)有關(guān)注對(duì)象類型的本身是什么。所以在python中使用isinstance來(lái)判斷傳入?yún)?shù)的類型是不提倡的,更pythonic的方法是直接使用傳入的參數(shù),通過(guò)try,except來(lái)處理傳入?yún)?shù)不符合要求的情況。我們應(yīng)該通過(guò)傳入對(duì)象的能力而不是傳入對(duì)象的類型來(lái)使用該對(duì)象。

總結(jié)

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

詳細(xì)介紹Python的鴨子類型

詳細(xì)介紹Python的鴨子類型:相信python的開(kāi)發(fā)者對(duì)于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準(zhǔn)確定義是是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定。所以這篇文章給大家
推薦度:
標(biāo)簽: 介紹 鴨子 具體
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 开鲁县| 青田县| 克山县| 榕江县| 秦皇岛市| 鄂伦春自治旗| 永胜县| 安岳县| 荔波县| 宾阳县| 鹤山市| 开平市| 军事| 来凤县| 扬州市| 泰兴市| 华阴市| 个旧市| 淳化县| 武宁县| 介休市| 大邑县| 昆山市| 镇康县| 格尔木市| 大同市| 福鼎市| 西和县| 友谊县| 安陆市| 宜兰县| 闵行区| 永仁县| 阜城县| 茶陵县| 德钦县| 库尔勒市| 蓬溪县| 绵阳市| 灵丘县| 霍林郭勒市|