我\xe2\x80\x99见过一些声明抽象方法的代码,这些方法实际上有一个不平凡的主体。
\n既然你无论如何都必须在任何具体的类中实现,那么这样做有什么意义呢?
\n难道只是为了让你做这样的事吗?
\n def method_a(self):\n super(self).method_a()\nRun Code Online (Sandbox Code Playgroud)\n
我之前在可能有具体实现的情况下使用过这个,但我想强制子类实现者考虑该实现是否适合他们。
一个具体的例子:我正在使用抽象工厂方法实现一个抽象基类,以便子类可以定义自己的__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将使得在不首先实现类的情况下不可能初始化该类,并且在正常测试期间肯定会出现。
| 归档时间: |
|
| 查看次数: |
11899 次 |
| 最近记录: |