Python 中面向接口編程詳情
前言
接口在軟件工程扮演重要角色,隨著應(yīng)用程序的功能不斷擴(kuò)展,代碼庫(kù)的更新和改變也難以管理。在許多情況下,會(huì)發(fā)現(xiàn)有一些看起來(lái)非常相似,但卻不相關(guān)的類(lèi),這可能會(huì)導(dǎo)致一些難于維護(hù)。在本次分享中,將看到你如何使用 Python 接口來(lái)幫助確定。
主要從下面幾個(gè)方面了解內(nèi)容:
- 了解接口的工作原理和創(chuàng)建 Python 接口的注意事項(xiàng)
- 理解接口在像 Python 這樣的動(dòng)態(tài)語(yǔ)言中重要性
- 實(shí)現(xiàn)一個(gè)非正式的 Python 接口
- 使用
abc.ABCMeta
和@abc.abstractmethod
來(lái)實(shí)現(xiàn)一個(gè)正式的 Python 接口
Python 中的接口與大多數(shù)其它語(yǔ)言的處理方式不同,它們的設(shè)計(jì)復(fù)雜性也不同。在本教程結(jié)束時(shí),你將對(duì) Python 的數(shù)據(jù)模型的某些方面有更好的理解,以及 Python 中的接口與 Java、C++ 和 Go 等語(yǔ)言中的接口的比較。
概述 Python 接口
在高層次上,接口充當(dāng)了設(shè)計(jì)類(lèi)的藍(lán)圖,在接口中,定義了方法與在類(lèi)中定義并沒(méi)有什么不同。不過(guò)不同于類(lèi),這些方法都是抽象方法。一個(gè)抽象的方法是定義接口的簡(jiǎn)單的方式。在這里定義了方法,并不急于實(shí)現(xiàn)這些方法。這是由具體的類(lèi)來(lái)完成的,然后由類(lèi)來(lái)實(shí)現(xiàn)接口,為接口的抽象方法賦予具體的意義。
與 Java、Go 和 C++ 這些語(yǔ)言相比,Python 的接口設(shè)計(jì)方法有些不同。這些語(yǔ)言都提供了一個(gè)interface
關(guān)鍵字來(lái)定義接口,而在 Python 中,卻沒(méi)有提供這個(gè)關(guān)鍵字。Python 在另一個(gè)方面與其他語(yǔ)言有明顯的區(qū)別。python 并不要求實(shí)現(xiàn)接口的類(lèi)來(lái)定義接口的所有抽象方法
非正式接口
在某些情況下,可能不需要正式的 Python 接口來(lái)嚴(yán)格規(guī)范。Python 的動(dòng)態(tài)特性允許實(shí)現(xiàn)一個(gè)非正式的接口。非正式的 Python 接口是一個(gè)定義了可以被重載的方法。
在下面的例子中,你將從一個(gè)數(shù)據(jù)工程師的角度出發(fā),他需要從各種不同的非結(jié)構(gòu)化文件類(lèi)型中提取文本,比如 PDF 和電子郵件。將創(chuàng)建一個(gè)非正式的接口,定義 PdfParser
和EmlParser
具體類(lèi)中的方法。
class InformalParserInterface: def load_data_source(self, path: str, file_name: str) -> str: """Load in the file for extracting text.""" pass def extract_text(self, full_file_name: str) -> dict: """Extract text from the currently loaded file.""" pass
在 InformalParserInterface
類(lèi)中定義了兩個(gè)方法,分別是 .load_data_source()
和 .extract_text()
。 雖然定義了方法卻沒(méi)有實(shí)現(xiàn)。接下來(lái)我們創(chuàng)建繼承 InformalParserInterface
的類(lèi)將需要實(shí)現(xiàn)這兩個(gè)方法。我們關(guān)心接口定義了提取文本一般流程,也可以看做規(guī)范,也就是我們首先會(huì)加載數(shù)據(jù)源,然后在數(shù)據(jù)源上提取文本。
InformalParserInterface
看起來(lái)就是一個(gè)標(biāo)準(zhǔn) python 的 class。不過(guò)因?yàn)樾嗡平涌谒钥梢詫⑦@個(gè)類(lèi)看做一個(gè)接口。
你定義了兩個(gè)實(shí)現(xiàn)InformalParserInterface
的類(lèi)。為了使用接口,首先創(chuàng)建一個(gè)具體類(lèi)來(lái)繼承于。接口,也就是這個(gè)類(lèi)是接口類(lèi)的子類(lèi),提供了接口抽象方法的具體實(shí)現(xiàn)。將創(chuàng)建兩個(gè)具體類(lèi)來(lái)實(shí)現(xiàn)你的接口。第一個(gè)是PdfParser
,將用來(lái)解析 PDF 文件的文本。
class PdfParser(InformalParserInterface): """Extract text from a PDF""" def load_data_source(self, path: str, file_name: str) -> str: """Overrides InformalParserInterface.load_data_source()""" pass def extract_text(self, full_file_path: str) -> dict: """Overrides InformalParserInterface.extract_text()""" pass
InformalParserInterface
的具體實(shí)現(xiàn)現(xiàn)在允許你從PDF文件中提取文本。第二個(gè)具體的類(lèi)是EmlParser
,將用來(lái)解析電子郵件中的文本。
class EmlParser(InformalParserInterface): """Extract text from an email""" def load_data_source(self, path: str, file_name: str) -> str: """Overrides InformalParserInterface.load_data_source()""" pass def extract_text_from_email(self, full_file_path: str) -> dict: """A method defined only in EmlParser. Does not override InformalParserInterface.extract_text() """ pass
InformalParserInterface
的具體實(shí)現(xiàn)現(xiàn)在允許你從電子郵件文件中提取文本。
到目前為止,定義了 InformalPythonInterface
的兩個(gè)具體實(shí)現(xiàn)。然而,請(qǐng)注意,EmlParser
未能正確定義.extract_text()
。要檢查EmlParser
是否實(shí)現(xiàn)了InformalParserInterface
抽象方法,也就是接口方法,可以參照如下代碼。
>>> # Check if both PdfParser and EmlParser implement InformalParserInterface >>> issubclass(PdfParser, InformalParserInterface) True >>> issubclass(EmlParser, InformalParserInterface) True
到此這篇關(guān)于Python 中面向接口編程詳情的文章就介紹到這了,更多相關(guān)Python 接口編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python [::-1] [::-1,::-1]的具體使用
本文主要介紹了python [::-1] [::-1,::-1]的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05使用Python matplotlib作圖時(shí),設(shè)置橫縱坐標(biāo)軸數(shù)值以百分比(%)顯示
這篇文章主要介紹了使用Python matplotlib作圖時(shí),設(shè)置橫縱坐標(biāo)軸數(shù)值以百分比(%)顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05caffe的python接口繪制loss和accuracy曲線(xiàn)
這篇文章主要為大家介紹了caffe的python接口繪制loss和accuracy曲線(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python實(shí)現(xiàn)遠(yuǎn)程控制電腦
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)遠(yuǎn)程控制電腦,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05python實(shí)現(xiàn)語(yǔ)音常用度量方法的代碼詳解
由于語(yǔ)音信號(hào)是一種緩慢變化的短時(shí)平穩(wěn)信號(hào),因而在不同時(shí)間段上的信噪比也應(yīng)不一樣。為了改善上面的問(wèn)題,可以采用分段信噪比。接下來(lái)通過(guò)本文給大家介紹python實(shí)現(xiàn)語(yǔ)音常用度量方法,感興趣的朋友跟隨小編一起看看吧2021-05-05通過(guò)python改變圖片特定區(qū)域的顏色詳解
這篇文章主要介紹了通過(guò)python改變圖片特定區(qū)域的顏色詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Django values()和value_list()的使用
這篇文章主要介紹了Django values()和value_list()的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03