这真的是一个抽象的类吗?

时间:2014-03-14 21:35:28

标签: python abstract-class

假设我有一个这样的类:

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

我是否正确地思考这种方式,如果是这样,使用抽象类而不仅仅使用继承有什么好处?

Link to relevant example

1 个答案:

答案 0 :(得分:1)

嗯,它不是PEP 3119中定义的抽象类,但它并不总是Python的一部分。像计算机科学中的许多东西一样,它取决于。 OO有许多种类,并且对抽象类的构成有相应的不同定义。

肯定存在一个论点,即它是一种抽象类,仅仅是因为NotImplemented错误。也许更适合Python,它被用作作为抽象类(想想“鸭子打字”)。如果您要使用Java的抽象定义,那么这并不成立,因为它仍然可以实例化。但是,请考虑:

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

可以说,object是Python中的抽象类,如果有的话。它是added to the language,因此内置对象可以将其子类化,以使整个Python中的OO行为更加一致。但是,正如您所看到的,它仍然可以实例化。

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

究竟什么构成“只使用继承”?即使在子类化(并且理想地完全实现)抽象类中,我们仍然使用继承。唯一的区别是抽象基类几乎不提供实现的方式,只是为一类对象定义规范,这是未来子类的蓝图。

最后,请考虑the docsNotImplementedError所说的内容:

  

例外NotImplementedError

     

此异常源自RuntimeError在用户定义的基类中,当抽象方法需要派生类来覆盖该方法时,它应该引发此异常

所以这非常符合Python提供的创建抽象类的方式。