最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)多態(tài)、協(xié)議和鴨子類型的代碼詳解

 更新時間:2019年05月05日 11:40:37   投稿:mrr  
問起面向?qū)ο蟮娜筇匦?,幾乎每個人都能對答如流:封裝、繼承、多態(tài)。今天我們就要來說一說Python實現(xiàn)多態(tài)、協(xié)議和鴨子類型,感興趣的朋友跟隨小編一起看看吧

多態(tài)

問起面向?qū)ο蟮娜筇匦?,幾乎每個人都能對答如流:封裝、繼承、多態(tài)。今天我們就要來說一說 Python 中的多態(tài)。

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

我在《Python 中的設(shè)計模式詳解之:策略模式》一文中詳細描述了策略模式的實現(xiàn),而策略模式就是典型的多態(tài)應(yīng)用。

之前的代碼我就不貼了,大家可以去原文中查看。我依然還是以商品折扣的經(jīng)典舉例。策略模式一文中,傳統(tǒng)的策略模式實現(xiàn)方式我也是用 Python 代碼實現(xiàn)的,在 java 或 C# 等語言中,實現(xiàn)方式也差不多。以下是 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),然后各個策略去實現(xiàn)這個接口。然而,Python 語言沒有 interface 關(guān)鍵字,就是說,Python 里沒有像 java、C# 一樣的接口。

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

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

協(xié)議和鴨子類型

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

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

在面向?qū)ο缶幊讨校瑓f(xié)議是非正式的接口,是一組方法,只由文檔和約定定義,因此,協(xié)議不能像正式接口那樣施加強制性約束。而 Python 的哲學(xué)就是盡量支持基本協(xié)議。

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

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

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

Python 中的協(xié)議舉例

Python 中有很多的協(xié)議,比如迭代器協(xié)議,任何實現(xiàn)了 __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

結(jié)語

鴨子類型是編程語言中動態(tài)類型語言中的一種設(shè)計風(fēng)格,一個對象的特征不是由父類決定,而是通過對象的方法決定的。

Python 不是不支持多態(tài),而是 Python 本身就是一門多態(tài)的語言。

相關(guān)文章

  • 重命名批處理python腳本

    重命名批處理python腳本

    師兄采集的視網(wǎng)膜圖像放在一個文件夾下,由于分類十分混亂,因此出現(xiàn)了一個文件多次出現(xiàn)的情況,因此讓我寫了個腳本
    2013-04-04
  • tf.truncated_normal與tf.random_normal的詳細用法

    tf.truncated_normal與tf.random_normal的詳細用法

    本篇文章主要介紹了tf.truncated_normal與tf.random_normal的詳細用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Python中if和elif的用法示例及區(qū)別詳解

    Python中if和elif的用法示例及區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Python中if和elif的用法示例及區(qū)別的相關(guān)資料,除了基本的if和else語句外,elif(即else?if)也是一個非常重要的組成部分,需要的朋友可以參考下
    2024-04-04
  • python調(diào)用matplotlib模塊繪制柱狀圖

    python調(diào)用matplotlib模塊繪制柱狀圖

    這篇文章主要為大家介紹了python調(diào)用matplotlib模塊繪制柱狀圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 如何用VScode配置Python開發(fā)環(huán)境

    如何用VScode配置Python開發(fā)環(huán)境

    這篇文章主要介紹了如何用VScode配置Python開發(fā)環(huán)境,vscode有很多優(yōu)點,用VScode來編寫Python,也是相當(dāng)?shù)暮糜玫?需要的朋友可以參考下
    2023-03-03
  • 詳談python read readline readlines的區(qū)別

    詳談python read readline readlines的區(qū)別

    下面小編就為大家?guī)硪黄斦刾ython read readline readlines的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • asyncio異步編程之Task對象詳解

    asyncio異步編程之Task對象詳解

    這篇文章主要為大家詳細介紹了asyncio異步編程之Task對象,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python?pandas修剪函數(shù)clip使用實例探究

    Python?pandas修剪函數(shù)clip使用實例探究

    在數(shù)據(jù)處理和分析中,經(jīng)常面臨著需要限制數(shù)據(jù)范圍的情況,而pandas庫提供的clip函數(shù)就是一個強大的工具,可以方便地對數(shù)據(jù)進行修剪,本文將深入介紹clip函數(shù)的基本用法、常見參數(shù)以及實際場景中的應(yīng)用,以幫助大家充分理解并靈活運用這一功能
    2024-01-01
  • pandas 缺失值與空值處理的實現(xiàn)方法

    pandas 缺失值與空值處理的實現(xiàn)方法

    這篇文章主要介紹了pandas 缺失值與空值處理的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • PyQt5 QFrame控件的用法詳解

    PyQt5 QFrame控件的用法詳解

    在PyQt5中,QFrame是一個重要的基類,它提供了邊框樣式、陰影效果、形狀等屬性,可以幫助開發(fā)者實現(xiàn)豐富多彩的界面效果,本文將結(jié)合實際案例,詳細介紹QFrame在PyQt5中的用法,需要的朋友可以參考下
    2024-08-08

最新評論

讷河市| 鹤山市| 宁晋县| 荆门市| 宜良县| 资兴市| 大竹县| 梅州市| 绥芬河市| 会泽县| 弥渡县| 两当县| 扎鲁特旗| 嫩江县| 苗栗市| 宁国市| 响水县| 镇原县| 景谷| 丽水市| 蛟河市| 永济市| 白玉县| 隆林| 武定县| 夏津县| 景泰县| 沈丘县| 巴林右旗| 梅州市| 甘泉县| 岱山县| 漳浦县| 沙坪坝区| 普兰县| 镇原县| 安岳县| 襄樊市| 会同县| 东莞市| 宁国市|