Python 3.5中的抽象方法体

Sha*_*ayn 10 python metaclass abstract-methods python-3.x

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

  1. 回报

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self): return
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过

    class Model(metaclass=ABCMeta):
        @abstractmethod
        def foo(self): pass
    
    Run Code Online (Sandbox Code Playgroud)
  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__))
    
    Run Code Online (Sandbox Code Playgroud)

通常我会实现方法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
Run Code Online (Sandbox Code Playgroud)

在提出的选项之间,哪个是最佳实践?或者还有另一种方法我应该处理这个问题吗?

MSe*_*ert 16

放入abstractmethod(或abstractproperty)主体的最好的东西是文档字符串.

然后,你不需要pass或者return还是...因为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."""
Run Code Online (Sandbox Code Playgroud)

然后docstring应该解释这里应该实现什么,以便子类知道什么是/意图.

  • 啊,好主意!我不知道为什么我没有想到这一点.我准备使用`pass`发布一个答案,但出于你提到的原因,这是一个更好的主意.+1 (3认同)