Foo
::
import abc
class Foo(abc.ABC):
@abc.abstractmethod
def bar(self):
raise NotImplementedError
我应该把什么放在
bar
方法的主体中?
我看到了许多具有
raise NotImplementedError
的代码,如上所示。但是,这似乎是多余的,因为任何未实施的子类实例化时都会提高bar
。
pythonic是pythonicTypeError: Can't instantiate abstract class Foo with abstract methods bar
空,如下:
bar
这是在Python文档中为AbstractBase Classiss撰写的,但我不确定这只是占位符还是如何编写代码的实际示例。
如果可以使用三个点(
import abc
class Foo(abc.ABC):
@abc.abstractmethod
def bar(self):
...
)离开,我什么时候应该使用bar
?
文档确实旨在为您提供一个例子。您不必遵循它。 您可以提供默认值;子类仍可以免费使用
...
来调用您的实现。这是大多数班级的工作;请参阅sourcecode
.。
class Sized(metaclass=ABCMeta):
# ...
@abstractmethod
def __len__(self):
return 0
中得出的。在用户定义的基类中,抽象方法应在需要派生的类覆盖方法或开发类以表明仍需要添加实际实现时提出此例外。
完整的清酒,以下是我在野外看到的其他一些事情(与官方建议相矛盾):
升起,只需使用ellipses(
使用它。raise NotImplementedError
)即可。这有一些官方的支持,因为这是摘要基础类别的官方python第py也很常见。 实际上,仅使用Docstring就足够了。恕我直言,任何方法都应该有任何docstring,所以这比
class FooBar(abc.ABC): @abstractmethod def foo(bar): """This method foos some bars""" raise NotImplementedError
NotImplementedError
RuntimeError
raise NotImplementedError