问题描述
假设我有一个像这样的课程:
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
。
我这样想是否正确,如果可以的话,使用抽象类而不是仅使用继承有什么好处?
1楼
嗯,它不是定义的抽象类,但这并不总是Python的一部分。 就像计算机科学中的许多事物一样,它取决于。 有很多OO风格,以及构成抽象类的相应定义也有所不同。
肯定有一个论点,就是由于NotImplemented
错误,它是一种抽象类。
也许更适合Python,它被用作抽象类(想想“鸭子打字”)。
如果您按照Java的抽象定义进行操作,这将无济于事,因为它仍然可以实例化。
但是,请考虑:
>>> obj = object() # This works; just doesn't do much
可以说,如果有的话, object
是Python中的抽象类。
它被精确地以便内置对象可以将其子类化,从而使OO行为在整个Python中更加一致。
但是,如您所见,它仍然可以实例化。
最后,您问“使用抽象类而不是仅使用继承有什么好处?”
“仅使用继承”的确切含义是什么? 即使在抽象类(最好是完全实现)的抽象类中,我们仍在使用继承。 唯一的区别是抽象基类几乎没有提供任何实现方式 ,而只是定义了一种对象类型的规范 ,即将来子类的蓝图。
最后,考虑一下关于NotImplementedError
:
异常
NotImplementedError
此异常派生自
RuntimeError
。 在用户定义的基类中,抽象方法要求派生类重写该方法时,应引发此异常 。
因此,这非常符合Python提供的创建抽象类的一种方式。