说我有以下抽象类Foo
:
import abc
class Foo(abc.ABC):
@abc.abstractmethod
def bar(self):
raise NotImplementedError
我应该在bar
方法的主体中添加什么?
我看到很多代码都有raise NotImplementedError
,如上所示。但是,这似乎是多余的,因为任何未实现bar
的子类在实例化时都会引发TypeError: Can't instantiate abstract class Foo with abstract methods bar
。
将bar
留空是Pythonic,如下所示:
import abc
class Foo(abc.ABC):
@abc.abstractmethod
def bar(self):
...
这是Abstract Base Classes的Python文档中所做的,但我不确定这只是占位符还是如何编写代码的实际示例。
如果只有三个点(bar
)离开...
,我应该何时使用NotImplementedError
?
答案 0 :(得分:8)
文档的目的是给你一个例子。你不必遵循它。
您可以提供默认值;子类仍然可以使用super()
来调用您的实现。这就是大多数collections.abc
类所做的事情;请参阅source code。
Size
会为0
返回__len__
:
class Sized(metaclass=ABCMeta):
# ...
@abstractmethod
def __len__(self):
return 0