設定 ABCMeta 元類

抽象類是要繼承的類,但是避免實現特定的方法,只留下子類必須實現的方法簽名。

抽象類對於在高階別定義和實施類抽象非常有用,類似於型別語言中的介面概念,而無需方法實現。

定義抽象類的一種概念方法是刪除類方法,然後在訪問時引發 NotImplementedError。這可以防止子類訪問父方法而不首先覆蓋它們。像這樣:

class Fruit:
    
    def check_ripeness(self):
        raise NotImplementedError("check_ripeness method not implemented!")

class Apple(Fruit):
    pass

a = Apple()
a.check_ripeness() # raises NotImplementedError

以這種方式建立抽象類可以防止不正確地使用未被覆蓋的方法,並且當然鼓勵在子類中定義方法,但它不會強制執行它們的定義。使用 abc 模組,我們可以防止子類在無法覆蓋其父級和祖先的抽象類方法時被例項化:

from abc import ABCMeta

class AbstractClass(object):
    # the metaclass attribute must always be set as a class variable 
    __metaclass__ = ABCMeta

   # the abstractmethod decorator registers this method as undefined
   @abstractmethod 
   def virtual_method_subclasses_must_define(self):
       # Can be left completely blank, or a base implementation can be provided
       # Note that ordinarily a blank interpretation implicitly returns `None`, 
       # but by registering, this behaviour is no longer enforced.

現在可以簡單地子類化和覆蓋:

class Subclass(AbstractClass):
    def virtual_method_subclasses_must_define(self):
        return