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
)正文中的最好的东西是文档字符串。
那么您就不需要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以上是关于Python 3.5中抽象方法的主体[重复]的主要内容,如果未能解决你的问题,请参考以下文章