網站首頁 Python教程 正文
前言
接口在軟件工程扮演重要角色,隨著應用程序的功能不斷擴展,代碼庫的更新和改變也難以管理。在許多情況下,會發現有一些看起來非常相似,但卻不相關的類,這可能會導致一些難于維護。在本次分享中,將看到你如何使用 Python 接口來幫助確定。
主要從下面幾個方面了解內容:
- 了解接口的工作原理和創建 Python 接口的注意事項
- 理解接口在像 Python 這樣的動態語言中重要性
- 實現一個非正式的 Python 接口
-
使用?
abc.ABCMeta
?和?@abc.abstractmethod
?來實現一個正式的 Python 接口
Python 中的接口與大多數其它語言的處理方式不同,它們的設計復雜性也不同。在本教程結束時,你將對 Python 的數據模型的某些方面有更好的理解,以及 Python 中的接口與 Java、C++ 和 Go 等語言中的接口的比較。
概述 Python 接口
在高層次上,接口充當了設計類的藍圖,在接口中,定義了方法與在類中定義并沒有什么不同。不過不同于類,這些方法都是抽象方法。一個抽象的方法是定義接口的簡單的方式。在這里定義了方法,并不急于實現這些方法。這是由具體的類來完成的,然后由類來實現接口,為接口的抽象方法賦予具體的意義。
與 Java、Go 和 C++ 這些語言相比,Python 的接口設計方法有些不同。這些語言都提供了一個interface
?關鍵字來定義接口,而在 Python 中,卻沒有提供這個關鍵字。Python 在另一個方面與其他語言有明顯的區別。python 并不要求實現接口的類來定義接口的所有抽象方法
非正式接口
在某些情況下,可能不需要正式的 Python 接口來嚴格規范。Python 的動態特性允許實現一個非正式的接口。非正式的 Python 接口是一個定義了可以被重載的方法。
在下面的例子中,你將從一個數據工程師的角度出發,他需要從各種不同的非結構化文件類型中提取文本,比如 PDF 和電子郵件。將創建一個非正式的接口,定義?PdfParser
和EmlParser
具體類中的方法。
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
類中定義了兩個方法,分別是?.load_data_source()
和?.extract_text()
。 雖然定義了方法卻沒有實現。接下來我們創建繼承?InformalParserInterface
的類將需要實現這兩個方法。我們關心接口定義了提取文本一般流程,也可以看做規范,也就是我們首先會加載數據源,然后在數據源上提取文本。
InformalParserInterface
看起來就是一個標準 python 的 class。不過因為形似接口所以可以將這個類看做一個接口。
你定義了兩個實現InformalParserInterface
的類。為了使用接口,首先創建一個具體類來繼承于。接口,也就是這個類是接口類的子類,提供了接口抽象方法的具體實現。將創建兩個具體類來實現你的接口。第一個是PdfParser
,將用來解析 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
的具體實現現在允許你從PDF文件中提取文本。第二個具體的類是EmlParser
,將用來解析電子郵件中的文本。
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
的具體實現現在允許你從電子郵件文件中提取文本。
到目前為止,定義了?InformalPythonInterface
的兩個具體實現。然而,請注意,EmlParser
未能正確定義.extract_text()
。要檢查EmlParser
是否實現了InformalParserInterface
?抽象方法,也就是接口方法,可以參照如下代碼。
>>> # Check if both PdfParser and EmlParser implement InformalParserInterface >>> issubclass(PdfParser, InformalParserInterface) True >>> issubclass(EmlParser, InformalParserInterface) True
原文鏈接:https://juejin.cn/post/7092009555604799495
相關推薦
- 2024-07-13 Spring AOP 基于注解的方式實現切面遍程
- 2022-07-22 C/C++冒泡排序
- 2022-08-06 C語言結構體數組常用的三種賦值方法(包含字符串)_C 語言
- 2022-07-28 Golang配置管理庫?Viper的教程詳解_Golang
- 2022-03-17 SQL?Server?DATEDIFF()?函數用法_MsSql
- 2022-04-29 Go語言中的通道channel詳情_Golang
- 2022-06-24 深度解析Python線程和進程_python
- 2022-05-12 解決終端關閉導致workerman關閉 終端關閉導致服務關閉
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支