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

Python中的面向接口編程示例詳解

 更新時(shí)間:2021年01月17日 11:04:27   作者:crossoverJie  
這篇文章主要給大家介紹了關(guān)于Python中面向接口編程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

”面向接口編程“寫(xiě) Java 的朋友耳朵已經(jīng)可以聽(tīng)出干繭了吧,當(dāng)然這個(gè)思想在 Java 中非常重要,甚至幾乎所有的編程語(yǔ)言都需要,畢竟程序具有良好的擴(kuò)展性、維護(hù)性誰(shuí)都不能拒絕。

最近無(wú)意間看到了我剛開(kāi)始寫(xiě) Python 時(shí)的部分代碼,當(dāng)時(shí)實(shí)現(xiàn)的需求有個(gè)很明顯的特點(diǎn):

  • 不同對(duì)象具有公共的行為能力,但具體每個(gè)對(duì)象的實(shí)現(xiàn)方式又各不相同。

說(shuō)人話就是商戶需要接入平臺(tái),接入的步驟相同,但具體實(shí)現(xiàn)不同。

作為一個(gè)”資深“ Javaer,需求還沒(méi)看完我就洋洋灑灑的把各個(gè)實(shí)現(xiàn)類寫(xiě)好了:

當(dāng)然最終也順利實(shí)現(xiàn)需求,甚至把組里一個(gè)沒(méi)寫(xiě)過(guò) Java 的大哥唬的一愣一愣的,直呼牛。

不過(guò)事后也給我吐槽:

  • 你這設(shè)計(jì)是不錯(cuò),但是感覺(jué)好復(fù)雜,跟代碼時(shí)要找到真正的業(yè)務(wù)邏輯(實(shí)現(xiàn)類)得繞幾圈。

截止目前 Python 寫(xiě)多了,我總算是能總結(jié)他的感受:就是不夠 Pythonic。

雖說(shuō) Python 沒(méi)有類似 Java 這樣的 Interface 特性,但作為面向?qū)ο蟮母呒?jí)語(yǔ)言也是支持繼承的;

在這里我們也可以利用繼承的特性來(lái)實(shí)現(xiàn)面向接口編程:

class Car:
 def run(self):
  pass

class Benz(Car):
 def run(self):
  print("benz run")

class BMW(Car):

 def run(self):
  print("bwm run")

def run(car):
 car.run()

if __name__ == "__main__":
 benz = Benz()
 bmw = BMW()

 run(benz)
 run(bmw)

代碼非常簡(jiǎn)單,在 Python 中也沒(méi)有類似于 Java 中的 extends 關(guān)鍵字,只需要在類聲明末尾用括號(hào)包含基類即可。

這樣在每個(gè)子類中就能單獨(dú)實(shí)現(xiàn)業(yè)務(wù)邏輯,方便擴(kuò)展和維護(hù)。

類型檢查

由于 Python 作為一個(gè)動(dòng)態(tài)類型語(yǔ)言,無(wú)法做到 Java 那樣在編譯期間校驗(yàn)一個(gè)類是否完全實(shí)現(xiàn)了某個(gè)接口的所有方法。

為此 Python 提供了解決辦法,那就是 abc(Abstract Base Classes) ,當(dāng)我們將基類用 abc 聲明時(shí)就能近似做到:

import abc
class Car(abc.ABC):
 @abc.abstractmethod
 def run(self):
  pass

class Benz(Car):
 def run(self):
  print("benz run")

class BMW(Car):
 pass

def run(car):
 car.run()

if __name__ == "__main__":
 benz = Benz()
 bmw = BMW()

 run(benz)
 run(bmw)

一旦有類沒(méi)有實(shí)現(xiàn)方法時(shí),運(yùn)行期間便會(huì)拋出異常:

bmw = BMW()
TypeError: Can't instantiate abstract class BMW with abstract methods run

雖然無(wú)法做到在運(yùn)行之前(畢竟不需要編譯)進(jìn)行校驗(yàn),但有總比沒(méi)有好。

鴨子類型

以上兩種方式看似已經(jīng)畢竟優(yōu)雅的實(shí)現(xiàn)面向接口編程了,但實(shí)際上也不夠 Pythonic。

在繼續(xù)之前我們先聊聊接口的本質(zhì)到底是什么?

在 Java 這類靜態(tài)語(yǔ)言中面向接口編程是比較麻煩的,也就是我們常說(shuō)的子類向父類轉(zhuǎn)型,因此需要編寫(xiě)額外的代碼。

帶來(lái)的好處也是顯而易見(jiàn),只需要父類便可運(yùn)行。

但我們也不必過(guò)于執(zhí)著于接口,它本身只是一個(gè)協(xié)議、規(guī)范,并不特指 Java 中的 Interface,甚至有些語(yǔ)言壓根沒(méi)有這個(gè)關(guān)鍵字。

動(dòng)態(tài)語(yǔ)言的特性也不需要強(qiáng)制校驗(yàn)是否實(shí)現(xiàn)了方法。

在 Python 中我們可以利用鴨子類型來(lái)優(yōu)雅的實(shí)現(xiàn)面向接口編程。

在這之前先了解下鴨子類型,借用維基百科的說(shuō)法:

  • “當(dāng)看到一只鳥(niǎo)走起來(lái)像鴨子、游泳起來(lái)像鴨子、叫起來(lái)也像鴨子,那么這只鳥(niǎo)就可以被稱為鴨子。”

我用大白話翻譯下就是:

即便兩個(gè)完全不想干的類,如果他們都實(shí)現(xiàn)了相同的方法,那就可以把他們當(dāng)做同一類型的類來(lái)使用。

舉個(gè)簡(jiǎn)單例子:

class Order:
 def create(self):
  pass

class User:
 def create(self):
  pass

def create(obj):
 obj.create()

if __name__ == "__main__":
 order = Order()
 user = User()
 create(order)
 create(user)

這里的 order 和 user 本身完全沒(méi)有關(guān)系,只是他們都有相同方法,又得益于動(dòng)態(tài)語(yǔ)言沒(méi)法校驗(yàn)類型的特點(diǎn),所以完全可以在運(yùn)行的時(shí)候認(rèn)為他們是同一種類型。

因此基于鴨子類型,之前的代碼我們可以稍作簡(jiǎn)化:

class Car:
 def run(self):
  pass

class Benz:
 def run(self):
  print("benz run")

class BMW:
 def run(self):
  print("bwm run")

def run(car):
 car.run()

if __name__ == "__main__":
 benz = Benz()
 bmw = BMW()

 run(benz)
 run(bmw)

因?yàn)樵邙喿宇愋椭形覀冊(cè)谝獾氖撬男袨?,而不是他們的類型;所以完全可以不用繼承便可以實(shí)現(xiàn)面向接口編程。

總結(jié)

我覺(jué)得平時(shí)沒(méi)有接觸過(guò)動(dòng)態(tài)類型語(yǔ)言的朋友,在了解完這些之后會(huì)發(fā)現(xiàn)新大陸,就像是 Python 老手第一次使用 Java 時(shí);雖然覺(jué)得語(yǔ)法啰嗦,但也會(huì)羨慕它的類型檢查、參數(shù)驗(yàn)證這類特點(diǎn)。

動(dòng)靜語(yǔ)言之爭(zhēng)這里不做討論了,各有各的好,鞋好不好穿只有自己知道。

隨便提一下其實(shí)不止動(dòng)態(tài)語(yǔ)言具備鴨子類型,有些靜態(tài)語(yǔ)言也能玩這個(gè)騷操作,感興趣下次再介紹。

到此這篇關(guān)于Python面向接口編程的文章就介紹到這了,更多相關(guān)Python面向接口編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中hash加密簡(jiǎn)介及使用方法

    Python中hash加密簡(jiǎn)介及使用方法

    常見(jiàn) Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已經(jīng)被破解,一般推薦至少使用 SHA2-256 算法,接下來(lái)通過(guò)本文給大家介紹Python中hash加密簡(jiǎn)介及使用方法,感興趣的朋友一起看看吧
    2022-01-01
  • Python實(shí)現(xiàn)以時(shí)間換空間的緩存替換算法

    Python實(shí)現(xiàn)以時(shí)間換空間的緩存替換算法

    緩存是指可以進(jìn)行高速數(shù)據(jù)交換的存儲(chǔ)器,它先于內(nèi)存與CPU交換數(shù)據(jù),因此速度很快。緩存就是把一些數(shù)據(jù)暫時(shí)存放于某些地方,可能是內(nèi)存,也有可能硬盤(pán)。下面給大家介紹Python實(shí)現(xiàn)以時(shí)間換空間的緩存替換算法,需要的朋友參考下
    2016-02-02
  • python微信跳一跳系列之色塊輪廓定位棋盤(pán)

    python微信跳一跳系列之色塊輪廓定位棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了python微信跳一跳系列,色塊輪廓定位棋盤(pán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決

    pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決

    這篇文章主要介紹了pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過(guò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python中操作文件之write()方法的使用教程

    Python中操作文件之write()方法的使用教程

    這篇文章主要介紹了Python中操作文件之write()方法的使用教程,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • python elasticsearch從創(chuàng)建索引到寫(xiě)入數(shù)據(jù)的全過(guò)程

    python elasticsearch從創(chuàng)建索引到寫(xiě)入數(shù)據(jù)的全過(guò)程

    這篇文章主要介紹了python elasticsearch從創(chuàng)建索引到寫(xiě)入數(shù)據(jù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • numpy中np.sort返回索引的具體使用

    numpy中np.sort返回索引的具體使用

    本文主要介紹了使用numpy中np.sort函數(shù)返回索引的詳細(xì)解釋和使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python hashlib常見(jiàn)摘要算法詳解

    Python hashlib常見(jiàn)摘要算法詳解

    這篇文章主要介紹了Python hashlib常見(jiàn)摘要算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python實(shí)現(xiàn)kmp算法的實(shí)例代碼

    python實(shí)現(xiàn)kmp算法的實(shí)例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)kmp算法的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • pyside6-uic生成py代碼中文為unicode(亂碼)的問(wèn)題解決方案

    pyside6-uic生成py代碼中文為unicode(亂碼)的問(wèn)題解決方案

    這篇文章主要介紹了如何解決pyside6-uic生成py代碼中文為unicode(亂碼)的問(wèn)題,文中通過(guò)代碼和圖文介紹的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

丰台区| 惠水县| 客服| 二连浩特市| 福建省| 博兴县| 广德县| 海盐县| 海原县| 获嘉县| 邹平县| 政和县| 正安县| 钦州市| 襄樊市| 刚察县| 浦东新区| 无棣县| 平原县| 油尖旺区| 禹州市| 杭锦后旗| 太仓市| 读书| 木里| 如皋市| 社会| 阿坝县| 闽清县| 墨玉县| 涟源市| 信宜市| 潍坊市| 北川| 汝阳县| 上饶县| 萝北县| 铜梁县| 阿鲁科尔沁旗| 威远县| 海南省|