何时使用“raise NotImplementedError”?

2024-06-11 21:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

是为了记住你自己和你的团队来正确地实现这个课程吗? 我不能完全使用这样的抽象类:

class RectangularRoom(object):
    def __init__(self, width, height):
        raise NotImplementedError

    def cleanTileAtPosition(self, pos):
        raise NotImplementedError

    def isTileCleaned(self, m, n):
        raise NotImplementedError

Tags: posselfobjectinitdef抽象类团队width
3条回答

作为Uriel says,它是指应该在子类中实现的抽象类中的方法,但也可以用于指示TODO。

对于第一个用例有一个替代方案:Abstract Base Classes。这些有助于创建抽象类。

下面是Python3示例:

class C(abc.ABC):
    @abstractmethod
    def my_abstract_method(self, ...):
    ...

当实例化C时,会得到一个错误,因为my_abstract_method是抽象的。您需要在子类中实现它。

TypeError: Can't instantiate abstract class C with abstract methods my_abstract_method

子类C并实现my_abstract_method

class D(C):
    def my_abstract_method(self, ...):
    ...

现在您可以实例化D

C.my_abstract_method不必为空。它可以使用super()D调用。

NotImplementedError相比,这种方法的一个优点是在实例化时而不是方法调用时获得显式的Exception

想想如果是:

class RectangularRoom(object):
    def __init__(self, width, height):
        pass

    def cleanTileAtPosition(self, pos):
        pass

    def isTileCleaned(self, m, n):
        pass

你给它子类化,却忘了告诉它如何isTileCleaned(),或者更可能的是,把它打成isTileCLeaned()。然后在您的代码中,当您调用它时,您将得到一个None

  • 你能得到你想要的重写函数吗?当然不是。
  • None输出是否有效?谁知道呢。
  • 这是故意的行为吗?几乎肯定不是。
  • 你会出错吗?这要看情况。

raise NotImplmentedError强制您实现它,因为它会在您尝试运行它时抛出异常,直到您这样做为止。这消除了许多无声的错误。这类似于为什么a bare except is almost never a good idea:因为人们会犯错误,这确保了他们不会被扫地出门。

注意:如其他答案所述,使用抽象基类更好,因为这样错误会被前加载,并且程序在您实现它们之前不会运行(对于NotImplementedError,只有在实际调用时才会抛出异常)。

如文档所述[docs]

In user defined base classes, abstract methods should raise this exception when they require derived classes to override the method, or while the class is being developed to indicate that the real implementation still needs to be added.

注意,尽管这个错误的主要用例是应该在继承类上实现的抽象方法的指示,但是您可以随意使用它,比如指示TODO标记。

相关问题 更多 >