Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.5中的抽象方法体_Python_Python 3.x_Metaclass_Abstract Methods - Fatal编程技术网

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__))
    
  • 通常我会实现方法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
    
    >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.