【问题标题】:How to actually use the NotImplementedError in python?如何在 python 中实际使用 NotImplementedError?
【发布时间】:2020-12-31 08:47:47
【问题描述】:

我目前有一个这样的基类:

from abc import ABC, abstractmethod

class BaseClass(ABC):
    @abstractmethod
    def __init__(self, param1, param2):
        self._param1 = param1
        self._param2 = param2

    @abstractmethod
    def foo(self):
        raise NotImplementedError("This needs to be implemented")

现在我有了希望用户覆盖的抽象方法 foo。所以如果他们定义一个这样的类:

from BaseClassFile import BaseClass

class DerrivedClass(BaseClass):
    def __init__(self, param1, param2):
        super().__init__(param1, param2)

所以这里的方法 foo 没有在 DerivedClass 中被覆盖/定义,当我创建这种类型的对象时,它会抛出一个 TypeError,但我想抛出一个 NotImplementedError。我该怎么办。

当前错误:

TypeError: Can't instantiate abstract class FF_Node with abstract methods forward

【问题讨论】:

  • “当我创建这种类型的对象时,它会抛出一个 TypeError,但我想抛出一个 NotImplementedError” - 你为什么想要一个 NotImplementedError? TypeError 是这里的标准预期结果。如果您尝试实际调用 BaseClass.foo(可能通过super 之类的方式发生),就会得到NotImplementedError。
  • 我希望它为用户提供更多信息,而不仅仅是 TypeError。就像我想给出一个自定义错误消息一样。
  • 标准错误已经很丰富了,不‽你需要重写ABC/abstractmethod; NotImplementedError 在这里并没有真正做任何事情。
  • 好的!人家说的有道理。但我希望即使具有相同的描述,我也能得到 NotImplementedError 而不是 TypeError。感谢您的帮助

标签: python error-handling abstract


【解决方案1】:

问题是,你的错误

TypeError: Can't instantiate abstract class FF_Node with abstract methods forward

被抛出的那一刻,你的实例就被创建了。当一个方法被声明为@abstractmethod 时,在继承这个父类的类中必须有一个覆盖方法。否则,一旦创建了子类的实例,python 就会抛出错误。

如果您希望代码抛出 NotImplementedError,则需要删除 @abstactmethod 装饰器。

不能调用抽象方法。 raise NotImplementedError() 这条线永远不会像日志一样到达@abstactmethod

【讨论】:

  • 你已经解释的很清楚了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2021-04-16
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多