Python 3.5中的抽象方法体
我有一个抽象类,Python 3.5中的抽象方法体,python,python-3.x,metaclass,abstract-methods,Python,Python 3.x,Metaclass,Abstract Methods,我有一个抽象类,Model,有一些抽象方法,我应该在方法体中放些什么 回报 class Model(metaclass=ABCMeta): @abstractmethod def foo(self): return 通行证 class Model(metaclass=ABCMeta): @abstractmethod def foo(self): pass 提出描述性错误 class Model(metaclass=ABCM
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__))
>>> 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
>bar=module.Model()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:无法使用抽象方法foo实例化抽象类模型
在提供的选项之间,哪一种是最佳做法?或者我应该用另一种方法来处理这个问题?在
抽象方法
(或抽象属性
)的主体中最好放一个docstring
然后您不需要传递
或返回
或..
,因为返回无
是隐式包含的-并且docstring使此构造“编译”而没有语法错误
:
from abc import abstractmethod, ABCMeta
class Model(metaclass=ABCMeta):
@abstractmethod
def foo(self):
"""This method should implement how to foo the model."""
然后,docstring应该解释应该在这里实现什么,以便子类程序知道它的意图。不要忘记调用代码是可能的,也就是说,
super().foo()
是受支持的。重复的。啊,好主意!我不知道为什么我没有想到这一点。我正要用pass
发布一个答案,但基于您提到的原因,这是一个更好的主意+1.