<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        詳細介紹Python的鴨子類型

        來源:懂視網 責編:小采 時間:2020-11-27 14:26:33
        文檔

        詳細介紹Python的鴨子類型

        詳細介紹Python的鴨子類型:相信python的開發者對于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準確定義是是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。所以這篇文章給大家
        推薦度:
        導讀詳細介紹Python的鴨子類型:相信python的開發者對于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準確定義是是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。所以這篇文章給大家

        相信python的開發者對于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準確定義是‘是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定’。所以這篇文章給大家python的鴨子類型。

        鴨子類型基本定義

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

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

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

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

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

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

        python中的具體實現

        下面的代碼就是一個簡單的鴨子類型

        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')

        對于一個鴨子類型來說,我們并不關心這個對象的類型本身或是這個類繼承,而是這個類是如何被使用的。我們可以通過下面的代碼來調用這些類的方法。

        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函數接收這個類的對象,然后并沒有檢查對象的類型,而是直接調用這個對象的走和游的方法,如果所需要的方法不存在就報錯。

        具體在python中鴨子類型的體現如下面的代碼所示

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

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

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

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

        總結

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

        文檔

        詳細介紹Python的鴨子類型

        詳細介紹Python的鴨子類型:相信python的開發者對于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準確定義是是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。所以這篇文章給大家
        推薦度:
        標簽: 介紹 鴨子 具體
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产美女在线精品免费观看| 一级做a爱过程免费视| 成人午夜免费福利视频| 亚洲资源在线观看| 97精品免费视频| 亚洲熟妇无码久久精品| 在线观看AV片永久免费| 中文无码亚洲精品字幕| 国产成人免费a在线资源| 香港经典a毛片免费观看看| 国产色婷婷精品免费视频| 特级av毛片免费观看| 亚洲中文字幕无码爆乳av中文| 九九99热免费最新版| 日韩亚洲Av人人夜夜澡人人爽| 亚洲高清视频免费| 亚洲成熟丰满熟妇高潮XXXXX| 免费国产精品视频| 中文在线观看国语高清免费| 久久精品国产亚洲AV网站| 国产92成人精品视频免费| 亚洲精品无码久久久久APP| 亚洲AV之男人的天堂| 日本高清免费观看| 亚洲国产成人久久99精品| 亚洲精品国产精品乱码不99 | 亚洲第一se情网站| 亚洲精品视频免费| 一区二区免费视频| 亚洲成a人无码亚洲成av无码 | 亚洲国产a级视频| 亚洲一区免费观看| 亚洲综合欧美色五月俺也去| 亚洲国产精品自在拍在线播放| 免费精品久久天干天干| 亚洲日本乱码卡2卡3卡新区| 久久久久亚洲av成人无码电影 | baoyu122.永久免费视频| 亚洲无码精品浪潮| 亚欧色视频在线观看免费| 免费一级全黄少妇性色生活片 |