[英]What should I put in the body of an abstract method?
假設我有以下抽象類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):
...
這是 Python 文檔中針對Abstract Base Classes所做的,但我不確定這只是一個占位符還是如何編寫代碼的實際示例。
如果可以只留下三個點( ...
),我NotImplementedError
bar
該文檔確實旨在為您提供一個示例。 你不必遵循它。
您可以提供默認值; 子類仍然可以免費使用super()
來調用您的實現。 這是大多數collections.abc
類所做的; 查看 源代碼。
Size
例如,為__len__
返回0
:
class Sized(metaclass=ABCMeta):
# ...
@abstractmethod
def __len__(self):
return 0
正如Martijn Pieters 所說,在默認值有意義的地方提供默認值。
如果您想與您的用戶交流他們絕對應該覆蓋它,請使用raise NotImplementedError
,如下所示:
class FooBar(abc.ABC):
@abstractmethod
def foo(bar):
"""This method foos some bars"""
raise NotImplementedError
報價:
異常
NotImplementedError
此異常源自
RuntimeError
。 在用戶定義的基類中,當抽象方法需要派生類覆蓋方法時,或者在開發類以指示仍需要添加實際實現時,它們應該引發此異常。
為了完整起見,以下是我在野外看到的其他一些事情(與官方關於raise NotImplementedError
的建議相矛盾:
...
) 。 這有一些官方支持,因為它是抽象基類的官方 python 文檔使用它的方式。pass
也很常見。...
或pass
更優雅。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.