2017-08-22 46 views
5

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

  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.__init__.__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 

提供的选项之间,这是最好的做法?还是有另一种方法我应该处理这个问题?

+1

不要忘记调用代码是可能的,即支持'super()。foo()'。 – dhke

+0

[我应该在Python的抽象方法中放置什么]的副本(https://stackoverflow.com/q/40894284/2301450)。 – vaultah

回答

7

abstractmethod(或abstractproperty)放入正文中的最好方法是文档字符串。

那么你不需要passreturn...因为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.""" 

然后将文档字符串应该解释应该是什么在这里实现,以便子类人员知道什么是/意图。

+1

啊,好主意!我不是为什么我没有想到这一点。我准备用'pass'发表一个答案,但是由于你提到的原因,这是一个更好的主意。 +1 –