我应该放在抽象方法的正文中?

问题描述 投票:0回答:2
say我有以下抽象类

Foo

import abc

class Foo(abc.ABC):

    @abc.abstractmethod
    def bar(self):
        raise NotImplementedError

我应该把什么放在

bar
方法的主体中?

我看到了许多具有

raise NotImplementedError
的代码,如上所示。但是,这似乎是多余的,因为任何未实施的子类实例化时都会提高
bar
。 pythonic是pythonic
TypeError: 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
.

python python-3.x abstract-class
2个回答
17
投票
例如,返回

super()

collections.abc

Size
    

MartijnPieters说

,在默认值有意义的地方提供了默认值。
如果您想与用户交流他们绝对应该覆盖它,请使用
0
这样:

__len__

7
投票
Quote

EXCEPTION

这个例外是从

class Sized(metaclass=ABCMeta): # ... @abstractmethod def __len__(self): return 0
中得出的。在用户定义的基类中,抽象方法应在需要派生的类覆盖方法或开发类以表明仍需要添加实际实现时提出此例外。

完整的清酒,以下是我在野外看到的其他一些事情(与官方建议相矛盾):

升起,只需使用ellipses(raise NotImplementedError
即可。这有一些官方的支持,因为这是摘要基础类别的官方python第py

使用它。

使用

class FooBar(abc.ABC):
    @abstractmethod
    def foo(bar):
        """This method foos some bars"""
        raise NotImplementedError
也很常见。

实际上,仅使用Docstring就足够了。恕我直言,任何方法都应该有任何docstring,所以这比
NotImplementedError

RuntimeError

raise NotImplementedError

  1. 	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.