如何使用@abstractmethod 创建一个抽象接口,指定其构造函数的参数结构?
How to use @abstractmethod to create an abstract interface that specifies the argument structure of its constructor?
我明白为什么下面的代码会抛出异常,并且有些方法可以避免该异常,但我不明白使用@abstractmethod 来创建抽象接口的预期方法。
我的目标是
- 创建一个具有单个参数构造函数的抽象接口 Foo
- 和一个适配器 class FooAdapter 可以被 class 打算实现 Foo 的 class 子
问题是,如果我在构造函数中添加对“super”的适当调用,我最终会调用抽象方法并引发异常。
- 修复 #1。不要添加超级。有效,但似乎是错误的,因为如果与其他 classes
混合使用,它可能会丢弃其他 classes 所需的信息
- 修复 #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'。
如果 subclass 没有实现指定的方法,@abstractmethod 机制将抛出异常。
来自 abc.abstarctmethod
description:
Note: Unlike Java
abstract methods, these abstract methods may have an implementation. This implementation can be called via the super()
mechanism from the class that overrides it. This could be useful as an end-point for a super-call in a framework that uses cooperative multiple-inheritance.
因此你只需要让 stub 什么都不做而不是提高 NotImlementedError
.
我明白为什么下面的代码会抛出异常,并且有些方法可以避免该异常,但我不明白使用@abstractmethod 来创建抽象接口的预期方法。
我的目标是
- 创建一个具有单个参数构造函数的抽象接口 Foo
- 和一个适配器 class FooAdapter 可以被 class 打算实现 Foo 的 class 子
问题是,如果我在构造函数中添加对“super”的适当调用,我最终会调用抽象方法并引发异常。
- 修复 #1。不要添加超级。有效,但似乎是错误的,因为如果与其他 classes 混合使用,它可能会丢弃其他 classes 所需的信息
- 修复 #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'。 如果 subclass 没有实现指定的方法,@abstractmethod 机制将抛出异常。
来自 abc.abstarctmethod
description:
Note: Unlike
Java
abstract methods, these abstract methods may have an implementation. This implementation can be called via thesuper()
mechanism from the class that overrides it. This could be useful as an end-point for a super-call in a framework that uses cooperative multiple-inheritance.
因此你只需要让 stub 什么都不做而不是提高 NotImlementedError
.