簡體   English   中英

我應該在抽象方法的主體中放入什么?

[英]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的建議相矛盾:

  1. 而不是提高,只需使用Ellipses ( ... ) 這有一些官方支持,因為它是抽象基類的官方 python 文檔使用它的方式。
  2. 僅使用pass也很常見。
  3. 實際上,僅使用文檔字符串就足夠了。 恕我直言,任何方法都應該有一個文檔字符串,所以這會比...pass更優雅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM