当前位置: 代码迷 >> python >> 这真的是抽象类吗?
  详细解决方案

这真的是抽象类吗?

热度:19   发布时间:2023-06-27 21:24:05.0

假设我有一个像这样的课程:

class Robot:
    def __init__(self, *args, **kwargs):
        raise NotImplementedError

    def some_method(self, *args, **kwargs):
        raise NotImplementedError

    # ... and so on; each method simply raises NotImplementedError

这真的是抽象类吗? 唯一看起来类似于抽象类的部分是raise NotImplementedError

我这样想是否正确,如果可以的话,使用抽象类而不是仅使用继承有什么好处?

嗯,它不是定义的抽象类,但这并不总是Python的一部分。 就像计算机科学中的许多事物一样,它取决于。 有很多OO风格,以及构成抽象类的相应定义也有所不同。

肯定有一个论点,就是由于NotImplemented错误,它是一种抽象类。 也许更适合Python,它被用作抽象类(想想“鸭子打字”)。 如果您按照Java的抽象定义进行操作,这将无济于事,因为它仍然可以实例化。 但是,请考虑:

>>> obj = object()  # This works; just doesn't do much

可以说,如果有的话, object是Python中的抽象类。 它被精确地以便内置对象可以将其子类化,从而使OO行为在整个Python中更加一致。 但是,如您所见,它仍然可以实例化。

最后,您问“使用抽象类而不是仅使用继承有什么好处?”

“仅使用继承”的确切含义是什么? 即使在抽象类(最好是完全实现)的抽象类中,我们仍在使用继承。 唯一的区别是抽象基类几乎没有提供任何实现方式 ,而只是定义了一种对象类型的规范 ,即将来子类的蓝图。

最后,考虑一下关于NotImplementedError

异常NotImplementedError

此异常派生自RuntimeError 在用户定义的基类中,抽象方法要求派生类重写该方法时,应引发此异常

因此,这非常符合Python提供的创建抽象类的一种方式。

  相关解决方案