首頁 > 軟體

Python 中面向介面程式設計詳情

2022-05-20 19:06:19

前言

介面在軟體工程扮演重要角色,隨著應用程式的功能不斷擴充套件,程式碼庫的更新和改變也難以管理。在許多情況下,會發現有一些看起來非常相似,但卻不相關的類,這可能會導致一些難於維護。在本次分享中,將看到你如何使用 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 和電子郵件。將建立一個非正式的介面,定義 PdfParserEmlParser具體類中的方法。

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

到此這篇關於Python 中面向介面程式設計詳情的文章就介紹到這了,更多相關Python 介面程式設計內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com