我应该把什么放在Python

时间:2016-11-30 17:12:33

标签: python python-3.x abstract-class

说我有以下抽象类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

1 个答案:

答案 0 :(得分:8)

文档的目的是给你一个例子。你不必遵循它。

您可以提供默认值;子类仍然可以使用super()来调用您的实现。这就是大多数collections.abc类所做的事情;请参阅source code

例如,

Size会为0返回__len__

class Sized(metaclass=ABCMeta):
    # ...
    @abstractmethod
    def __len__(self):
        return 0