為什麼如何使用 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!"
這次當你例項化一個物件時,它的工作原理!