Python 3.5 中的抽象方法体

Body of abstract method in Python 3.5

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

  1. 一个return

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            return
    
  2. 一传

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self):
            pass
    
  3. 引发描述性错误

    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

在提供的选项之间,哪个是最佳做法?或者我应该用另一种方法来处理这个问题吗?

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

那么你不需要 passreturn... 因为 return None 是隐含的 - 并且文档字符串使这个构造 "compile"没有 SyntaxError:

from abc import abstractmethod, ABCMeta

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

然后文档字符串应该解释应该在这里实现什么,以便子类知道 is/was 的意图。