等等!python和鸭子是什么关系?
點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
今
日
雞
湯
窮則變,變則通,通則久。
眾所周知,python是一門編程語(yǔ)言,它可以做的東西很多,爬蟲、人工智能、自動(dòng)化測(cè)試、數(shù)據(jù)分析等等。而鴨子是一種動(dòng)物,它可以做的東西也很多,啤酒鴨、香烤鴨、鹽水鴨、土豆?fàn)F鴨等等。按理說(shuō)這兩個(gè)對(duì)應(yīng)著不同人體器官的東西應(yīng)該是扯不上關(guān)系的。
但是,偏偏就有辣莫一個(gè)人,美國(guó)詩(shī)人詹姆斯·惠特科姆·萊利,在17世紀(jì)時(shí)寫下了一句詩(shī):
「When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.」
就是這短短的一句詩(shī),讓這兩者扯上了神奇的關(guān)系,關(guān)鍵人們還為這種關(guān)系取了個(gè)名字 -- 鴨子類型。從此python和鴨子就成就了一段佳話啊呸,那這鴨子類型究竟是怎么回事呢?且往下看~
思考一個(gè)場(chǎng)景
加入在你擁有一款內(nèi)容聚合應(yīng)用,這款應(yīng)用每天會(huì)從各個(gè)門戶網(wǎng)站采集一些文章回來(lái),并且分發(fā)至應(yīng)用里面的各個(gè)頻道。
這個(gè)時(shí)候我們可以將分發(fā)文章這個(gè)功能簡(jiǎn)單的抽象為一個(gè)distribute函數(shù),該函數(shù)由兩個(gè)參數(shù)構(gòu)成,待分發(fā)文章article,分發(fā)頻道channel。
同時(shí)為了保證文章更符合頻道的內(nèi)容范圍和調(diào)性,在每篇文章分發(fā)至頻道時(shí),最好都對(duì)文章做一些準(zhǔn)入校驗(yàn),于是我們初步封裝出以下函數(shù):
def?distribute(article,?channel):#?文章準(zhǔn)入判斷#?政務(wù)頻道的文章標(biāo)題不能出現(xiàn)‘震驚’字眼if?channel.name?==?'politics'?and?article.title.find('震驚')?>=?0:return?False#?娛樂(lè)頻道不允許a,b這兩個(gè)作者的文章elif?channel.name?==?'entertainment'?and?article.author?in?['a','b']:return?False#?some?elif?here...#?將文章與頻道的綁定關(guān)系寫進(jìn)數(shù)據(jù)庫(kù)return?bind_relation(article,?channel)上面的函數(shù)確實(shí)能夠?qū)崿F(xiàn)我們想要的功能了,但是存在一個(gè)顯而易見的問(wèn)題:如果我們每增加一條準(zhǔn)入規(guī)則,就需要改動(dòng)一次distribute函數(shù),這樣頻繁地對(duì)一個(gè)函數(shù)動(dòng)刀顯然不是一個(gè)好的做法。
我們希望這個(gè)函數(shù)是一個(gè)更抽象的公共函數(shù),他不需要被過(guò)多的改動(dòng),于是我們做一點(diǎn)改進(jìn),變成下面的函數(shù):
def?distribute(article,?channel):#?文章準(zhǔn)入判斷can_push?=?channel.check(article)#?將文章與頻道的綁定關(guān)系寫進(jìn)數(shù)據(jù)庫(kù)if?can_push:return?bind_relation(article,?channel)return?False將校驗(yàn)頻道準(zhǔn)入規(guī)則的這個(gè)功能用頻道類自己實(shí)現(xiàn)的check方法封裝起來(lái),這樣每當(dāng)有一個(gè)新的頻道需要?jiǎng)?chuàng)建,或者舊頻道需要更改校驗(yàn)規(guī)則,則只需要負(fù)責(zé)維護(hù)各自頻道類的check方法就好了。
而distribute函數(shù)作為一個(gè)更高層級(jí)的存在則不會(huì)被影響到。
class?Article:def?__init__(self,?title,?author):self.title?=?titleself.author?=?authorclass?EntertainmentChannel:def?__init__(self)self.name?=?'entertainment'def?check(article):if?article.author?in?['a','b']:return?Falsereturn?Trueclass?PoliticsChannel:def?__init__(self)self.name?=?'politics'def?check(article):if?article.title.find('震驚')?>=?0:return?Falsereturn?Truearitcle_a?=?Article('震驚!大笑1小時(shí)壽命減少60分鐘!',?'a') aritcle_b?=?Article('戰(zhàn)勝恐懼最好的辦法?',?'b')politics_channel?=?PoliticsChannel() entertainment_channel?=?EntertainmentChannel()distribute(aritcle_a,?politics_channel)??#?Fasle distribute(aritcle_b,?entertainment_channel)??#?Fasle多態(tài)
上面對(duì)于distribute函數(shù)的改造結(jié)果,其實(shí)很類似于面向?qū)ο笕筇卣髦?—— 多態(tài) 的應(yīng)用。
簡(jiǎn)單解釋起來(lái),多態(tài)就是同一操作(方法)被作用于不同的對(duì)象時(shí),可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。
例如上面的check方法,當(dāng)它由EntertainmentChannel類實(shí)例調(diào)用時(shí),檢查的是文章標(biāo)題不能包含“震驚”字眼;由PoliticsChannel類實(shí)例調(diào)用時(shí),檢查的是文章作者不能是’a'和‘b’。
多態(tài)在靜態(tài)語(yǔ)言如 Java 中,通常通過(guò)子類繼承父類,然后子類重寫父類中的某些方法來(lái)實(shí)現(xiàn)多態(tài)。但是在python中,不需要搞子承父業(yè)這一套,只需要在不同的類里面實(shí)現(xiàn)好名字相同的方法,即可在運(yùn)行時(shí)表現(xiàn)出多態(tài)。
只不過(guò),這種特征在python中一般不叫多態(tài),而是我們前面提到的——鴨子類型。
鴨子類型
鴨子類型的名字來(lái)源和具體應(yīng)用場(chǎng)景前面已經(jīng)描述過(guò)了,而關(guān)于鴨子類型的定義,網(wǎng)上出現(xiàn)最多的就是對(duì)文章開頭那句英文詩(shī)句的翻譯:
如果一只鳥走起來(lái)像鴨子,發(fā)出的聲音像鴨子,游起來(lái)像鴨子,那么它就是一只鴨子
這句話重點(diǎn)在于引導(dǎo)我們只關(guān)注事物的行為,而不是關(guān)注事物本身和它的表現(xiàn)。再看一個(gè)幫助理解的栗子????:
class?Duck:def?sound(self):print('quack')def?walk(self):print('da?da?da')class?Dog:def?sound(self):print('wang')def?walk(self):print('tita?tita?tita')def?walk_and_sound(animal):animal.walk()animal.sound()dog?=?Dog() duck?=?Duck()walk_and_sound(dog)?#?tita?tita?tita?wang walk_and_sound(duck)?#?da?da?da?quack就好像一只狗會(huì)走,會(huì)叫;鴨子也會(huì)走,會(huì)叫。狗有很多行為都跟鴨子相似,他們做的動(dòng)作是一樣的,只是表現(xiàn)出來(lái)不一樣。
我們關(guān)注的是類有什么方法,能做什么,而不是類是怎么定義的,表現(xiàn)出來(lái)是怎么樣的。這個(gè)正是鴨子類型想表達(dá)的思想。
總結(jié)
鴨子類型是python中多態(tài)的一種實(shí)現(xiàn)方式。
鴨子類型強(qiáng)調(diào)關(guān)注事物的行為而不是事物本身和事物的表現(xiàn),如果某些類都實(shí)現(xiàn)了同名方法,那這些類就符合鴨子類型。
后記&引用
其實(shí)我仔細(xì)想了想,如果我早出生幾個(gè)世紀(jì),在詹姆斯·惠特科姆·萊利寫出那句詩(shī)之前,喊出 「如果一個(gè)四肢動(dòng)物走起來(lái)像狗,叫起來(lái)像狗,傻起來(lái)像狗,那它就是一只狗」~這樣一句話。
是不是現(xiàn)在就不叫鴨子類型而改叫狗子類型呢?唉,又錯(cuò)過(guò)了名留千史的機(jī)會(huì),還是應(yīng)了一句老話:出名要趁早啊!
-------------------?End?-------------------
往期精彩文章推薦:
Python環(huán)境搭建—安利Python小白的Python和Pycharm安裝詳細(xì)教程
一篇文章教會(huì)你理解Scrapy網(wǎng)絡(luò)爬蟲框架的工作原理和數(shù)據(jù)采集過(guò)程
利用Python網(wǎng)絡(luò)爬蟲抓取微信好友的簽名及其可視化展示
歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
總結(jié)
以上是生活随笔為你收集整理的等等!python和鸭子是什么关系?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据结构练习题【哈夫曼树、图、排序、散列
- 下一篇: python中encode函数_pyth