鴨子型別(wiki)

2021-06-08 00:40:50 字數 1216 閱讀 2773

在程式設計中,鴨子型別(英語:duck typing)是動態型別的一種風格。在這種風格中,乙個物件有效的語義,不是由繼承自特定的類或實現特定的介面,而是由當前方法和屬性的集合決定。這個概念的名字**於由james whitcomb riley提出的鴨子測試(見下面的「歷史」章節),「鴨子測試」可以這樣表述:

「當看到乙隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這只鳥就可以被稱為鴨子。」

[1][2]

在鴨子型別中,關注的不是物件的型別本身,而是它是如何使用的。例如,在不使用鴨子型別的語言中,我們可以編寫乙個函式,它接受乙個型別為鴨的物件,並呼叫它的走和叫方法。在使用鴨子型別的語言中,這樣的乙個函式可以接受乙個任意型別的物件,並呼叫它的走和叫方法。如果這些需要被呼叫的方法不存在,那麼將引發乙個執行時錯誤。任何擁有這樣的正確的走和叫方法的物件都可被函式接受的這種行為引出了以上表述,這種決定型別的方式因此得名。

鴨子型別通常得益於不測試方法和函式中引數的型別,而是依賴文件、清晰的**和測試來確保正確使用。從靜態型別語言轉向動態型別語言的使用者通常試圖新增一些靜態的(在執行之前的)型別檢查,從而影響了鴨子型別的益處和可伸縮性,並約束了語言的動態特性。

考慮用於乙個使用鴨子型別的語言的以下偽**:

functioncalculate(a, b, c) =>return(a+b)*c

example1 = calculate (1, 2, 3)

example2 = calculate ([1, 2, 3], [4, 5, 6], 2)print to_stringexample1print to_stringexample2print to_stringexample3

在樣例中,每次對calculate的呼叫都使用的物件(數字、列表和字串)在繼承關係中沒有聯絡。只要物件支援「+」和「*」方法,操作就能成功。例如,翻譯成ruby或python語言,執行結果應該是:

9

[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

這樣,鴨子型別在不使用繼承的情況下使用了多型。唯一的要求是calculate函式需要作為引數的物件擁有「+」和「*」方法。以下樣例(python語言)體現了鴨子測試。

鴨子型別(wiki)

在程式設計中,鴨子型別 英語 duck typing 是動態型別的一種風格。在這種風格中,乙個物件有效的語義,不是由繼承自特定的類或實現特定的介面,而是由當前方法和屬性的集合決定。這個概念的名字 於由james whitcomb riley提出的鴨子測試 見下面的 歷史 章節 鴨子測試 可以這樣表述...

鴨子型別(duck typing)

鴨子型別 duck typing 在程式設計中,鴨子型別 duck typing 是動態型別的一種風格。在這種風格中,乙個物件有效的語義,不是由繼承自特定的類或實現特定的介面,而是由當前方法和屬性的集合決定。當看到乙隻鳥走起來像鴨子 游泳起來像鴨子 叫起來也像鴨子,那麼這只鳥就可以被稱為鴨子。在鴨子...

python的鴨子型別

這次簡單介紹下 鴨子型別的概念。當看到乙隻鳥走起來像鴨子 游泳起來像鴨子 叫起來也像鴨子,那麼這只鳥就可以被稱為鴨子。鴨子型別關注點在物件的行為,而不是型別。在 python 和 go 中都可以實現鴨子型別。示例 如下 class duck def init self,name self.name ...