Python 3.5中抽象方法的主体[重复]

Posted

技术标签:

【中文标题】Python 3.5中抽象方法的主体[重复]【英文标题】:Body of abstract method in Python 3.5 [duplicate] 【发布时间】:2018-01-31 06:35:37 【问题描述】:

我有一个抽象类Model,有几个抽象方法,我应该在方法体中放什么?

    回归

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            return
    

    通行证

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            pass
    

    引发描述性错误

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            raise NotImplementedError("Class class_name doesn't implement func_name function"
                                  .format(class_name=self.__class__.__name__, func_name=self.foo.__name__))
    

通常我会实现方法 3 并引发错误,但它看起来是多余的,因为 Python 会为我引发错误:

>>> bar = module.Model()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Model with abstract methods foo

在提供的选项之间,最佳做法是什么?或者我应该有其他方法来处理这个问题吗?

【问题讨论】:

别忘了调用代码是可以的,即支持super().foo() What should I put in the body of an abstract method in Python 的副本。 【参考方案1】:

放在abstractmethod(或abstractproperty)正文中的最好的东西是文档字符串。

那么您就不需要passreturn...,因为隐式包含return None - 并且文档字符串使该构造在没有SyntaxError 的情况下“编译”:

from abc import abstractmethod, ABCMeta

class Model(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        """This method should implement how to foo the model."""

然后文档字符串应该解释这里应该实现什么,以便子类知道什么是/预期的。

【讨论】:

啊,好主意!我不知道为什么我没有想到这一点。我正要使用pass 发布答案,但由于您提到的原因,这是一个更好的主意。 +1

以上是关于Python 3.5中抽象方法的主体[重复]的主要内容,如果未能解决你的问题,请参考以下文章

抽象类

抽象类

Python中的抽象方法[重复]

抽象类

抽象类,接口_05

java 抽象类