日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

PythonI/O進(jìn)階學(xué)習(xí)筆記_3.1面向?qū)ο缶幊蘝python的多態(tài)和鴨子類型

系統(tǒng) 1773 0

前言:

與第一篇的面向?qū)ο髢?nèi)容不同的是,第一篇中的面向?qū)ο蟾嗟氖桥c類、對(duì)象結(jié)合起來的概念粗淺理解,就是在編程歷史中誕生的一種思想方法。

這篇的面向?qū)ο缶幊蹋嗦鋵?shí)到在語言設(shè)計(jì)實(shí)現(xiàn)中,是如何體現(xiàn)面向?qū)ο筮@一設(shè)計(jì)思想的。

本篇內(nèi)容圍繞 python基礎(chǔ)教程這段:
在面向?qū)ο缶幊讨校g(shù)語對(duì)象大致意味著一系列數(shù)據(jù)(屬性)以及一套訪問和操作這些數(shù)據(jù)的方法。使用對(duì)象而非全局變量和函數(shù)的原因有多個(gè),下面列出了使用對(duì)象的最重要的好處。
? 多態(tài):可對(duì)不同類型的對(duì)象執(zhí)行相同的操作,而這些操作就像“被施了魔法”一樣能夠正常運(yùn)行。
? 封裝:對(duì)外部隱藏有關(guān)對(duì)象工作原理的細(xì)節(jié)。
? 繼承:可基于通用類創(chuàng)建出專用類。
內(nèi)容較多,這篇為上篇。

Content:

- 類和對(duì)象的多態(tài)

- - 多態(tài)和鴨子類型

1.什么是多態(tài)?

2.什么是鴨子類型?

3.動(dòng)態(tài)python的多態(tài)和其他動(dòng)態(tài)語言的區(qū)別? 和靜態(tài)語言多態(tài)的區(qū)別?

4.python語言中鴨子類型的應(yīng)用?

下篇內(nèi)容:

- 類和對(duì)象的封裝、繼承

- - 抽象基類

- - 類屬性,實(shí)例屬性和其查找順序

- - 靜態(tài)方法、類方法、對(duì)象方法

- - 數(shù)據(jù)封裝和私有屬性

- - python的自省機(jī)制

- - python中的super函數(shù)

- - django中的繼承

- - 上下文管理器

?

一? 類的多態(tài)和鴨子類型

1.什么是多態(tài)?

? ? 同一操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果,這就是多態(tài)性。

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

? ? 多態(tài)的好處:

? ? a.應(yīng)用程序不必為每一個(gè)派生類編寫功能調(diào)用,只需要對(duì)抽象基類進(jìn)行處理即可。大大提高程序的 可復(fù)用性 。//繼承?

? ? b.派生類的功能可以被基類的方法或引用變量所調(diào)用,這叫向后兼容,可以提高 可擴(kuò)充性 可維護(hù)性 。? ? ?//多態(tài)的真正作用

?

2.什么是鴨子類型?

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

? ? 鴨子類型(英語:duck typing)是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。這個(gè)概念的名字來源于由James Whitcomb Riley提出的鴨子測試,“鴨子測試”可以這樣表述:“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子?!?
? ? ?python是很崇尚鴨子類型的。
?
3. python的鴨子類型和多態(tài)是什么關(guān)系呢?和其他靜態(tài)語言多態(tài)的區(qū)別?
? ? 多態(tài)是一個(gè)廣泛的概念,所有面向?qū)ο缶幊陶Z言中,都具有多態(tài)性,但是我們不說python支持多態(tài),只說c++,java支持多態(tài)。因?yàn)閜ython本身就是多態(tài)的,并且python不存在不多態(tài)。
? ? 什么意思呢?
? ? 就是傳統(tǒng)c++,java所說的多態(tài),是所有子類,繼承了父類的所有方法情況下,定義了自己的方法,不同對(duì)象(繼承了同一父類的類生成的)調(diào)用了同一方法執(zhí)行不同。這叫我們實(shí)現(xiàn)了這兩者語言中的多態(tài)。
? ? 但是python所崇尚的鴨子類型更牛批的地方在于,我不在乎是不是有父類、父類是誰,任何多個(gè)沒有繼承的類,我只要實(shí)現(xiàn)了相同名字的方法,那么這幾個(gè)不同類生成的對(duì)象就有了同一個(gè)特性,能用同一個(gè)方法,就能有多態(tài)性。 Python是只要你有一模一樣的函數(shù)存在,那么他就可以按照多態(tài)的處理方式來給你處理。
例子:
如果用python來表示c++、java中的多態(tài):
              
                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的多態(tài):
              
                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()
              
            
通常不提倡繼承式的多態(tài),更提倡第二種pythonic的多態(tài)。
是不是很奇怪,看起來第一種繼承式的更常用更有用的樣子?注意不要混淆python繼承的常用情況和多態(tài)的常用情況。看4中python的實(shí)際應(yīng)用大概就能明白了。
?

4.鴨子類型在python語言設(shè)計(jì)中的實(shí)際應(yīng)用?

例用list實(shí)現(xiàn)了的extend方法來看。

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

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

? ? extend方法的參數(shù)是接收一個(gè)可迭代的對(duì)象,而list、tuple、和set對(duì)象都實(shí)現(xiàn)了__iter__(self)(定義當(dāng)?shù)萜髦械脑氐男袨椋?,這就是所謂的, 它不關(guān)注對(duì)象的類型,而是關(guān)注對(duì)象具有的行為(方法)。
?
? ? 這個(gè)接口的描述告訴我們,不是只用list作為參數(shù),而是只要是 可迭代對(duì)象 都可以。甚至是迭代類型的生成器也是可以的。 自己實(shí)現(xiàn)一個(gè)類,是可以迭代的,也是可以放進(jìn)來的。
?
? ? 這點(diǎn)是很重要的,可迭代類型共同具有的方法__iter__,來給所有的類定義了一種性質(zhì),就是它可迭代,就跟3中所有的類都實(shí)現(xiàn)了say這個(gè)方法,那么它們都可以say一樣。這就是鴨子類型的真正用處,重點(diǎn)關(guān)注list、dict、set都因?yàn)開_iter__成為了可迭代類型,而不是它是list類型、set類型等。(這里與之前的魔法函數(shù)又對(duì)上啦)
ps.調(diào)用對(duì)象里的 __getitem__、__iter__等魔法函數(shù),就說明這個(gè)對(duì)象是可迭代的,這個(gè)方法不會(huì)拋異常,而會(huì)一直執(zhí)行下去。
?
關(guān)于魔法函數(shù)和鴨子類型的總結(jié):
a.通過魔法函數(shù)對(duì)python對(duì)象進(jìn)行了分組,對(duì)同組對(duì)象進(jìn)行相同行為的定義實(shí)現(xiàn)多態(tài)。
b.鴨子類型在python最初設(shè)定的時(shí)候就設(shè)定好了,對(duì)于一個(gè)對(duì)象,我們重點(diǎn)在于其設(shè)置的方法,而不是對(duì)象類型。

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 垫江县| 霍州市| 太原市| 贵州省| 万年县| 弋阳县| 宝鸡市| 大方县| 汝城县| 安远县| 西吉县| 徐闻县| 锡林浩特市| 日照市| 健康| 亳州市| 甘孜县| 秭归县| 华池县| 安新县| 安丘市| 开平市| 邛崃市| 巴东县| 临武县| 泗水县| 马鞍山市| 阿拉善盟| 永泰县| 阜平县| 宝鸡市| 永福县| 蒙阴县| 察哈| 阿勒泰市| 蓬溪县| 游戏| 双牌县| 皮山县| 宜城市| 曲水县|