為什麼如何使用 ABCMeta 和 abstractmethod

抽象基類(ABCs)強制派生類從基類實現特定方法。

要了解這是如何工作的以及為什麼要使用它,讓我們來看看 Van Rossum 會喜歡的一個例子。假設我們有一個 Base 類 MontyPython,它有兩個必須由所有派生類實現的方法(笑話和妙語)。

class MontyPython:
    def joke(self):
        raise NotImplementedError()

    def punchline(self):
        raise NotImplementedError()

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

當我們例項化一個物件並呼叫它的兩個方法時,我們將使用 punchline() 方法得到一個錯誤(如預期的那樣)。

 >>> sketch = ArgumentClinic() 
 >>> sketch.punchline() 
NotImplementedError 

但是,這仍然允許我們例項化 ArgumentClinic 類的物件而不會出現錯誤。實際上,在我們查詢 punchline() 之前,我們不會收到錯誤。

通過使用抽象基類(ABC)模組可以避免這種情況。讓我們看看這是如何使用相同的例子:

from abc import ABCMeta, abstractmethod

class MontyPython(metaclass=ABCMeta):
    @abstractmethod
    def joke(self):
        pass

@abstractmethod
def punchline(self):
    pass

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

這次當我們嘗試從不完整的類中例項化一個物件時,我們立即得到一個 TypeError!

>>> c = ArgumentClinic()
TypeError:
"Can't instantiate abstract class ArgumentClinic with abstract methods punchline"

在這種情況下,很容易完成類以避免任何 TypeErrors:

class ArgumentClinic(MontyPython):
    def joke(self):
        return "Hahahahahah"

    def punchline(self):
        return "Send in the constable!"

這次當你例項化一個物件時,它的工作原理!