具有默认实现的 @abstractmethod 有什么意义?

8 python abstract-class

我\xe2\x80\x99见过一些声明抽象方法的代码,这些方法实际上有一个不平凡的主体。

\n

既然你无论如何都必须在任何具体的类中实现,那么这样做有什么意义呢?

\n

难道只是为了让你做这样的事吗?

\n
   def method_a(self):\n          super(self).method_a()\n
Run Code Online (Sandbox Code Playgroud)\n

rch*_*ome 7

我之前在可能有具体实现的情况下使用过这个,但我想强制子类实现者考虑该实现是否适合他们。

一个具体的例子:我正在使用抽象工厂方法实现一个抽象基类,以便子类可以定义自己的__init__函数,但有一个公共接口来创建它们。这就像

class Foo(ABC):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @classmethod
    @abstractmethod
    def from_args(cls, a, b, c) -> "Foo":
        return cls(a, b, c)
Run Code Online (Sandbox Code Playgroud)

子类通常只需要参数的子集。在测试时,访问实际使用此工厂方法的框架很麻烦,因此很可能有人会忘记实现from_args工厂函数,因为它不会在他们平时的测试中出现。使其成为一个abstractmethod将使得在不首先实现类的情况下不可能初始化该类,并且在正常测试期间肯定会出现。