【发布时间】:2021-03-31 10:14:25
【问题描述】:
我理解为什么下面的代码会抛出异常,并且有一些方法可以避免该异常,但我不明白使用@abstractmethod 来创建抽象接口的预期方式。
我的目标是
- 创建一个具有单参数构造函数的抽象接口 Foo
- 和一个适配器类 FooAdapter,它可以被打算实现 Foo 的类子类化。
问题是,如果我在构造函数中添加对“super”的适当调用,我最终会调用抽象方法并引发异常。
- 修复 #1。不要添加超级。有效,但似乎是错误的,因为如果与其他类混合,它可能会丢弃其他类所需的信息
- 修复 #2。不要在界面中添加 init 的签名。有效,但似乎是错误的,因为接口的全部意义在于定义接口。我不会那样做,至少对于构造函数不会。
我觉得我想错了。什么pythonic方式??
from abc import ABC, abstractmethod
class Foo(ABC):
@abstractmethod
def __init__(self, my_arg):
raise NotImplementedError
class FooAdapter(Foo):
def __init__(self, my_arg):
super().__init__()
来自下面接受的答案
您根本不需要使用 NotImplementedError,只需使用“pass”即可。 如果子类没有实现指定的方法,@abstractmethod 机制会抛出异常。
【问题讨论】:
标签: python oop inheritance interface abstract-class