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

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

  1. 回归

    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

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

【问题讨论】:

标签: python python-3.x metaclass abstract-methods


【解决方案1】:

放在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."""

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

【讨论】:

  • 啊,好主意!我不知道为什么我没有想到这一点。我正要使用pass 发布答案,但由于您提到的原因,这是一个更好的主意。 +1
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2013-07-04
  • 2014-08-28
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多