欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python實現多態、協議和鴨子類型的代碼詳解

系統 1864 0

多態

問起面向對象的三大特性,幾乎每個人都能對答如流: 封裝、繼承、多態 。今天我們就要來說一說 Python 中的多態。

所謂多態:就是指一個類實例的相同方法在不同情形有不同表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

我在《Python 中的設計模式詳解之:策略模式》一文中詳細描述了策略模式的實現,而策略模式就是典型的多態應用。

之前的代碼我就不貼了,大家可以去原文中查看。我依然還是以商品折扣的經典舉例。策略模式一文中,傳統的策略模式實現方式我也是用 Python 代碼實現的,在 java 或 C# 等語言中,實現方式也差不多。以下是 C# 代碼,我只列了個架子:

            
interface Promotion
{
 double discount(Order order);
}
class FidelityPromo : Promotion // 第一個具體策略
{
 // 為積分為1000或以上的顧客提供5%折扣
 public double discount(Order order)
 {
  ...
 }
}
class BulkItemPromo : Promotion // 第二個具體策略
{
 //單個商品為20個或以上時提供10%折扣
 public double discount(Order order)
 {
  ...
 }
}
class LargeOrderPromo : Promotion // 第三個具體策略
{
 //訂單中的不同商品達到10個或以上時提供7%折扣
 public double discount(Order order)
 {
  ...
 }
}
          

可以看到,首先要有一個接口(Promotion),然后各個策略去實現這個接口。然而,Python 語言沒有 interface 關鍵字,就是說,Python 里沒有像 java、C# 一樣的接口。

在策略模式一文的實現中,使用了抽象基類(Abstract Base Class,ABC)來實現接口,這主要是為了寫法上看起來和 java、C# 等語言更加的像,易于有這些語言基礎的同學理解和對比。

抽象基類是在 Python 語言誕生 15 年后,Python 2.6 才引入的。這里我們不詳細介紹抽象基類,因為即便現在也很少有代碼使用抽象基類。對于多態,Python 有更好的實現方式――鴨子類型(duck typing)。

協議和鴨子類型

所謂 鴨子類型 就是:如果一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么它就是鴨子。這個概念的名字來源于 James Whitcomb Riley 提出的鴨子測試。

初次看到這個描述的小伙伴一定一頭霧水,為了理解鴨子類型,我們不得不提到另一個名詞――協議。

在面向對象編程中,協議是非正式的接口,是一組方法,只由文檔和約定定義,因此,協議不能像正式接口那樣施加強制性約束。而 Python 的哲學就是盡量支持基本協議。

翻譯成人話,就是:Python 中沒有接口,在需要使用接口的地方,就用協議代替。所謂協議,其實就是一組方法,和接口中定義的方法一個意思。只不過協議是不是強制性的約定,如果你不遵守協議,那么也沒關系,運行時報錯就是了。

這樣就好理解鴨子類型了,“如果一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子” 這就表示已經遵守了協議,“那么它就是鴨子”,意味著你可以在其他用到“鴨子”的地方,用“這只鳥”替換。這不就是多態嗎?

用“鴨子類型”來實現策略模式也很簡單,刪掉抽象基類就可以了。(這就是為什么抽象基類很少使用的原因,因為刪掉代碼也一樣正確啊。)有興趣的小伙伴可以自己嘗試一下代碼。

Python 中的協議舉例

Python 中有很多的協議,比如迭代器協議,任何實現了 __iter__ 和 __next__ 方法的對象都可稱之為迭代器,但對象本身是什么類型不受限制,這得益于鴨子類型。

            
from collections import Iterable
from collections import Iterator

class MyIterator:
 def __iter__(self):
  pass
 def __next__(self):
  pass
print(isinstance(MyIterator(), Iterable)) 
print(isinstance(MyIterator(), Iterator))
          

輸出:

True
True

結語

鴨子類型是編程語言中動態類型語言中的一種設計風格,一個對象的特征不是由父類決定,而是通過對象的方法決定的。

Python 不是不支持多態,而是 Python 本身就是一門多態的語言。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 狠狠色依依成人婷婷九月 | 国产一区中文字幕 | 日韩成人在线观看视频 | 国产精品久久久久秋霞影视 | 欧美一级毛片欧美大尺度一级毛片 | 欧美国产激情二区三区 | 中文字幕一区二区三区四区 | 91成人午夜性a一级毛片 | 99久久一区二区 | 夜色成人网 | 中文字幕网在线 | 天堂在线91| 日日视频 | 极品美女aⅴ高清在线观看 一级片片 | 亚州老熟女A片AV色欲小说 | 免费看一区二区三区 | 欧美一级aⅴ毛片 | 看个毛片| 日本亚洲成人 | 奇米影视7777久久精品人人爽 | 亚洲精品国产成人 | 天天干天天操天天爽 | 97丨九色丨国产人妻熟女 | cheaperapp.work直接访问 | 国产精品你懂的在线播放 | 特级欧美视频aaaaaa | 制服丝袜成人动漫 | 激情大乳女做爰办公室韩国 | 日韩看片| 国产欧美视频在线观看 | 亚洲一区视频在线 | 青草免费观看 | 欧美日韩中文字幕一区二区高清 | 黄色片在线免费看 | 亚洲一区二区国产 | 91网在线观看 | 国内自拍视频在线观看 | 欧美成人一级片 | 麻豆传媒视频入口 | 欧美国产精品久久 | 日韩亚洲欧美视频 |