欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

PythonI/O進階學習筆記_3.1面向對象編程_python的多態和鴨子類型

系統 1637 0

前言:

與第一篇的面向對象內容不同的是,第一篇中的面向對象更多的是與類、對象結合起來的概念粗淺理解,就是在編程歷史中誕生的一種思想方法。

這篇的面向對象編程,更多落實到在語言設計實現中,是如何體現面向對象這一設計思想的。

本篇內容圍繞 python基礎教程這段:
在面向對象編程中,術語對象大致意味著一系列數據(屬性)以及一套訪問和操作這些數據的方法。使用對象而非全局變量和函數的原因有多個,下面列出了使用對象的最重要的好處。
? 多態:可對不同類型的對象執行相同的操作,而這些操作就像“被施了魔法”一樣能夠正常運行。
? 封裝:對外部隱藏有關對象工作原理的細節。
? 繼承:可基于通用類創建出專用類。
內容較多,這篇為上篇。

Content:

- 類和對象的多態

- - 多態和鴨子類型

1.什么是多態?

2.什么是鴨子類型?

3.動態python的多態和其他動態語言的區別? 和靜態語言多態的區別?

4.python語言中鴨子類型的應用?

下篇內容:

- 類和對象的封裝、繼承

- - 抽象基類

- - 類屬性,實例屬性和其查找順序

- - 靜態方法、類方法、對象方法

- - 數據封裝和私有屬性

- - python的自省機制

- - python中的super函數

- - django中的繼承

- - 上下文管理器

?

一? 類的多態和鴨子類型

1.什么是多態?

? ? 同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果,這就是多態性。

? ? 簡單來說,就是有一個父類,很多子類繼承了父類的方法但是對父類的方法進行了自己的定制(或者是在python中很多不同的類實現了同一個名字的方法),我生成這些子類的所有對象都有同一個方法,調用這些對象的相同方法但是有不同的結果。

? ? 多態的好處:

? ? a.應用程序不必為每一個派生類編寫功能調用,只需要對抽象基類進行處理即可。大大提高程序的 可復用性 。//繼承?

? ? b.派生類的功能可以被基類的方法或引用變量所調用,這叫向后兼容,可以提高 可擴充性 可維護性 。? ? ?//多態的真正作用

?

2.什么是鴨子類型?

? ? 即所有的類都實現了同一種方法,調用得時候可以同時調用這一種方法。在任何對象中,指定某一個方法名,所有類都可以通用,就為鴨子類型。 (是不是很像多態的概念?)

? ? 鴨子類型(英語:duck typing)是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由當前方法和屬性的集合決定。這個概念的名字來源于由James Whitcomb Riley提出的鴨子測試,“鴨子測試”可以這樣表述:“當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”
? ? ?python是很崇尚鴨子類型的。
?
3. python的鴨子類型和多態是什么關系呢?和其他靜態語言多態的區別?
? ? 多態是一個廣泛的概念,所有面向對象編程語言中,都具有多態性,但是我們不說python支持多態,只說c++,java支持多態。因為python本身就是多態的,并且python不存在不多態。
? ? 什么意思呢?
? ? 就是傳統c++,java所說的多態,是所有子類,繼承了父類的所有方法情況下,定義了自己的方法,不同對象(繼承了同一父類的類生成的)調用了同一方法執行不同。這叫我們實現了這兩者語言中的多態。
? ? 但是python所崇尚的鴨子類型更牛批的地方在于,我不在乎是不是有父類、父類是誰,任何多個沒有繼承的類,我只要實現了相同名字的方法,那么這幾個不同類生成的對象就有了同一個特性,能用同一個方法,就能有多態性。 Python是只要你有一模一樣的函數存在,那么他就可以按照多態的處理方式來給你處理。
例子:
如果用python來表示c++、java中的多態:
              
                class
              
              
                 Animals():
    
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
                say something
              
              
                "
              
              
                )


              
              
                class
              
              
                 Duck(Animals):
    
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
                gaga
              
              
                "
              
              
                )


              
              
                class
              
              
                 Dog(Animals):
    
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
                wangwang
              
              
                "
              
              
                )


              
              
                class
              
              
                 Miao(Animals):
    
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
                miaomiao
              
              
                "
              
              )
            
pythonic的多態:
              
                class
              
              
                  Cat():
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
              
                "
              
              
                )

              
              
                class
              
              
                 Dog():
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
              
                "
              
              
                )

              
              
                class
              
              
                 Duck():
              
              
                def
              
              
                 say(self):
        
              
              
                print
              
              (
              
                "
              
              
                gaga
              
              
                "
              
              
                )
animals_list
              
              =
              
                [Cat,Dog,Duck]

              
              
                for
              
               i 
              
                in
              
              
                 animals_list:
    i().say()
              
            
通常不提倡繼承式的多態,更提倡第二種pythonic的多態。
是不是很奇怪,看起來第一種繼承式的更常用更有用的樣子?注意不要混淆python繼承的常用情況和多態的常用情況。看4中python的實際應用大概就能明白了。
?

4.鴨子類型在python語言設計中的實際應用?

例用list實現了的extend方法來看。

描述:extend() 函數用于在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)。

語法:extend()方法語法: list . extend ( seq )

? ? extend方法的參數是接收一個可迭代的對象,而list、tuple、和set對象都實現了__iter__(self)(定義當迭代容器中的元素的行為),這就是所謂的, 它不關注對象的類型,而是關注對象具有的行為(方法)。
?
? ? 這個接口的描述告訴我們,不是只用list作為參數,而是只要是 可迭代對象 都可以。甚至是迭代類型的生成器也是可以的。 自己實現一個類,是可以迭代的,也是可以放進來的。
?
? ? 這點是很重要的,可迭代類型共同具有的方法__iter__,來給所有的類定義了一種性質,就是它可迭代,就跟3中所有的類都實現了say這個方法,那么它們都可以say一樣。這就是鴨子類型的真正用處,重點關注list、dict、set都因為__iter__成為了可迭代類型,而不是它是list類型、set類型等。(這里與之前的魔法函數又對上啦)
ps.調用對象里的 __getitem__、__iter__等魔法函數,就說明這個對象是可迭代的,這個方法不會拋異常,而會一直執行下去。
?
關于魔法函數和鴨子類型的總結:
a.通過魔法函數對python對象進行了分組,對同組對象進行相同行為的定義實現多態。
b.鴨子類型在python最初設定的時候就設定好了,對于一個對象,我們重點在于其設置的方法,而不是對象類型。

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色欧美亚洲 | 国产视频中文字幕 | 国产精品视频免费 | 天天拍久久 | 涩涩色综合亚洲悠悠色 | 国产小视频在线高清播放 | 久久综合色婷婷 | www.91在线 | 亚洲欧美日韩精品中文乱码 | 日韩在线 在线播放 | 成人影音| 欧美很黄视频在线观看 | 欧美日韩国产综合网 | 91精选国产91在线观看 | 欧美性网| 中文字幕日韩欧美一区二区三区 | 国产精品蜜芽在线观看 | 波多野结衣三级视频 | 国产性夜夜性夜夜爽91 | 香港三级日本三级a视频 | 亚洲高清中文字幕综合网 | 狠狠的撸2015最新版狠狠的撸2015最新版 | 国产美女黄色片 | 久久精片| 欧亚乱熟女一区二区在线 | 久久综合图区亚洲综合图区 | 亚欧精品一区二区三区四区 | 亚洲韩精品欧美一区二区三区 | 午夜视频免费国产在线 | 鲁丝片一区二区三区毛片 | 日韩精品一区二区三区 | 日本三级带日本三级带黄国产 | 看片国产 | 亚洲国产欧美在线 | 国产精品视频网 | 亚洲3p | 国产黄三级三·级三级 | 国产高清视频一区二区 | 国产a级一级久久毛片 | 午夜小视频在线播放 | 男女午夜视频 |