Python 3.5 中的抽象方法体
Body of abstract method in Python 3.5
我有一个抽象class,Model
,有几个抽象方法,我应该把什么放在方法的主体中?
一个return
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
在提供的选项之间,哪个是最佳做法?或者我应该用另一种方法来处理这个问题吗?
放在abstractmethod
(或abstractproperty
)正文中的最好的东西是文档字符串。
那么你不需要 pass
或 return
或 ...
因为 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 的意图。
我有一个抽象class,Model
,有几个抽象方法,我应该把什么放在方法的主体中?
一个return
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
在提供的选项之间,哪个是最佳做法?或者我应该用另一种方法来处理这个问题吗?
放在abstractmethod
(或abstractproperty
)正文中的最好的东西是文档字符串。
那么你不需要 pass
或 return
或 ...
因为 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 的意图。