国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解duck typing鴨子類型程序設(shè)計與Python的實現(xiàn)示例

2019-11-25 16:45:43
字體:
供稿:網(wǎng)友

在程序設(shè)計中,鴨子類型(英語:duck typing)是動態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。
這個概念的名字來源于由James Whitcomb Riley提出的鴨子測試,“鴨子測試”可以這樣表述:
“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”
在鴨子類型中,關(guān)注的不是對象的類型本身,而是它是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個函數(shù),它接受一個類型為鴨的對象,并調(diào)用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函數(shù)可以接受一個任意類型的對象,并調(diào)用它的走和叫方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個運行時錯誤。任何擁有這樣的正確的走和叫方法的對象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。
鴨子類型通常得益于不測試方法和函數(shù)中參數(shù)的類型,而是依賴文檔、清晰的代碼和測試來確保正確使用。從靜態(tài)類型語言轉(zhuǎn)向動態(tài)類型語言的用戶通常試圖添加一些靜態(tài)的(在運行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,并約束了語言的動態(tài)特性。

Python代碼示例
上面這樣說可能太空洞了。比如在Python中,有很多file-like的東西,比如StringIO,GzipFile,socket。它們有很多相同的方法,我們把它們當(dāng)作文件使用。
又比如list.extend()方法中,我們并不關(guān)心它的參數(shù)是不是list,只要它是可迭代的,所以它的參數(shù)可以是list/tuple/dict/字符串/生成器等.
鴨子類型在動態(tài)語言中經(jīng)常使用,非常靈活,使得python不想java那樣專門去弄一大堆的設(shè)計模式。

下面例子用duck typing來實現(xiàn)多態(tài)。

#coding=utf-8 class Duck:   def quack(self):     print "Quaaaaaack!"  class Bird:   def quack(self):     print "bird imitate duck."  class Doge:   def quack(self):     print "doge imitate duck."  def in_the_forest(duck):   duck.quack()  duck = Duck() bird = Bird() doge = Doge() for x in [duck, bird, doge]:   in_the_forest(x) 

再舉個栗子,
我們來hack輸出流。

import sys  sys.stdout = open('stdout.log', 'a') #只要是file-like,不管是什么類型 print 'foo'  sys.stdout = sys.__stdout__ #恢復(fù) print 'bar' 

這樣就把輸出流給寫入到文件中去了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹿邑县| 宜章县| 福泉市| 金门县| 忻城县| 汉川市| 扶余县| 湄潭县| 郧西县| 子长县| 樟树市| 广丰县| 南昌县| 吉安市| 涿州市| 沙田区| 天津市| 庆安县| 凤阳县| 英吉沙县| 酒泉市| 蓬溪县| 闽清县| 克拉玛依市| 龙山县| 辉南县| 乐业县| 香河县| 武胜县| 长治市| 绥芬河市| 珠海市| 揭东县| 西乌珠穆沁旗| 凉城县| 雷山县| 禹城市| 景洪市| 海南省| 突泉县| 建阳市|