亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 1763 0

前言:

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

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

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

Content:

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

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

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

2.什么是鴨子類型?

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

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

下篇內(nèi)容:

- 類和對象的封裝、繼承

- - 抽象基類

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

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

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

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

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

- - django中的繼承

- - 上下文管理器

?

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

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

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

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

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

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

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

?

2.什么是鴨子類型?

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

? ? 鴨子類型(英語:duck typing)是動態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對象有效的語義,不是由繼承自特定的類或?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),是所有子類,繼承了父類的所有方法情況下,定義了自己的方法,不同對象(繼承了同一父類的類生成的)調(diào)用了同一方法執(zhí)行不同。這叫我們實(shí)現(xiàn)了這兩者語言中的多態(tài)。
? ? 但是python所崇尚的鴨子類型更牛批的地方在于,我不在乎是不是有父類、父類是誰,任何多個(gè)沒有繼承的類,我只要實(shí)現(xiàn)了相同名字的方法,那么這幾個(gè)不同類生成的對象就有了同一個(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è)可迭代的對象,而list、tuple、和set對象都實(shí)現(xiàn)了__iter__(self)(定義當(dāng)?shù)萜髦械脑氐男袨椋@就是所謂的, 它不關(guān)注對象的類型,而是關(guān)注對象具有的行為(方法)。
?
? ? 這個(gè)接口的描述告訴我們,不是只用list作為參數(shù),而是只要是 可迭代對象 都可以。甚至是迭代類型的生成器也是可以的。 自己實(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ù)又對上啦)
ps.調(diào)用對象里的 __getitem__、__iter__等魔法函數(shù),就說明這個(gè)對象是可迭代的,這個(gè)方法不會拋異常,而會一直執(zhí)行下去。
?
關(guān)于魔法函數(shù)和鴨子類型的總結(jié):
a.通過魔法函數(shù)對python對象進(jìn)行了分組,對同組對象進(jìn)行相同行為的定義實(shí)現(xiàn)多態(tài)。
b.鴨子類型在python最初設(shè)定的時(shí)候就設(shè)定好了,對于一個(gè)對象,我們重點(diǎn)在于其設(shè)置的方法,而不是對象類型。

?


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 男女很黄很色床视频网站免 | 国产真实乱xxxav | 日韩国产成人 | 九九久久精品这里久久网 | 青青久草在线视频 | 在线观看欧洲成人免费视频 | 欧美开嫩苞实拍视频在线观看 | 乱色美www女麻豆 | 色精品视频 | 色汉综合 | 亚洲精品不卡视频 | 大香线一本| 青青草国产免费一区二区 | 91婷婷色涩涩 | 日本亚洲免费 | 狠狠躁夜夜躁人人爽天天miya | 日韩精选视频 | 日本在线一区二区 | 久久99精品久久久久久首页 | 一级特黄特交牲大片 | 久久婷婷综合在线视频观看6 | 国产一区二区三区免费看 | 一级毛片在线播放 | 亚洲欧美日韩精品中文乱码 | 七月婷婷精品视频在线观看 | 亚洲精品视频一区二区 | 欧美高清69hd | 中文字幕国产综合 | 中文字幕欧美日韩 | 久久免费播放视频 | 欧美白人猛性xxxxx交69 | 国产青草视频免费观看97 | 久久99热久久精品在线6 | 亚洲国产成人精品女人久久久 | 亚洲线精品一区二区三区 | 国内精品久久国产大陆 | chinese国产xxxx中国 | 色婷婷99综合久久久精品 | 九九九视频 | 精品久久一区二区三区 | 国产精品一国产精品免费 |