• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答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
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

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

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

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

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

    鴨子類型基本定義

    首先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ā)一個運(yùn)行時錯誤。任何擁有這樣的正確的走和叫方法的對象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。

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

    python中的具體實現(xià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')

    對于一個鴨子類型來說,我們并不關(guān)心這個對象的類型本身或是這個類繼承,而是這個類是如何被使用的。我們可以通過下面的代碼來調(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ù)接收這個類的對象,然后并沒有檢查對象的類型,而是直接調(diào)用這個對象的走和游的方法,如果所需要的方法不存在就報錯。

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

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

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

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

    總結(jié)

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

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品一区二区久久精品无码| 久久精品无码免费不卡| 国产成人精品亚洲精品| 中文字幕无码精品亚洲资源网久久 | 午夜国产精品无套| 欧美精品香蕉在线观看网| 无码国产精品一区二区免费式芒果| 久久久久无码精品国产| 欧美 日韩 精品 另类视频| 日韩精品免费在线视频| 国产精品va无码一区二区| 亚洲精品夜夜夜妓女网| 精品国产呦系列在线观看免费 | 2021国产成人精品国产| 亚洲精品成人片在线播放| 国产精品制服丝袜亚洲欧美| 青青草国产精品久久| 99精品在线播放| 国产精品露脸国语对白| 亚洲精品国产精品乱码视色| 老湿亚洲永久精品ww47香蕉图片| 国产A级毛片久久久精品毛片| 国产福利91精品一区二区| 麻豆国产在线精品国偷产拍| 亚洲精品黄色视频在线观看免费资源| 国产一区二区三区欧美精品| 在线人成精品免费视频| 精品一区二区久久| 国产精品91在线| 国产精品爽爽va在线观看网站| 亚洲国产精品尤物yw在线| 亚洲国产精品福利片在线观看 | 巨大黑人极品VIDEOS精品| 久久国产香蕉一区精品| 久久激情亚洲精品无码?V| 精品久久久久国产免费 | 欧洲精品码一区二区三区免费看 | 欧美精品亚洲人成在线观看| 久久这里只有精品视频99| 亚洲AV蜜桃永久无码精品| 香港aa三级久久三级老师2021国产三级精品三级在 |