假设我有一个这样的类:
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
。
我是否正确地思考这种方式,如果是这样,使用抽象类而不仅仅使用继承有什么好处?
答案 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 docs对NotImplementedError
所说的内容:
例外
NotImplementedError
此异常源自
RuntimeError
。 在用户定义的基类中,当抽象方法需要派生类来覆盖该方法时,它应该引发此异常。
所以这非常符合Python提供的创建抽象类的方式。