【问题标题】:How to use @abstractmethod to create an abstract interface that specifies the argument structure of its constructor?如何使用@abstractmethod 创建一个抽象接口,指定其构造函数的参数结构?
【发布时间】: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


    【解决方案1】:

    来自abc.abstarctmethoddescription

    注意:与Java 抽象方法不同,这些抽象方法可能有实现。可以通过覆盖它的类中的super() 机制调用此实现。这对于在使用协作多重继承的框架中作为超级调用的端点很有用。

    因此你只需要让存根什么都不做而不是提高NotImlementedError

    【讨论】:

    • 哦!明白了,所以我的答案是根本不使用“NotImplementedError”。并使用@abstractmethod 机制确保所有子类都在此处添加某种方法。知道了。谢谢!我的困惑来自于认为我应该使用 NotImplementedError 来捕获未实现,但在这种情况下这是错误的。
    猜你喜欢
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多