Python中的纯虚方法

Igo*_*bin 11 python oop inheritance virtual-functions

在Python 中实现纯虚方法的思想正确方法是什么?

只是提高NotImplementedError方法?

或者,还有更好的方法?

谢谢!

gon*_*opp 14

虽然看到人们使用NotImplementedError的情况并不少见,但有些人会认为"正确"的方法(因为python 2.6)使用抽象基类,通过abc模块:

from abc import ABCMeta, abstractmethod

class MyAbstractClass(object):
    __metaclass__=ABCMeta
    @abstractmethod
    def my_abstract_method():
        pass
Run Code Online (Sandbox Code Playgroud)

使用abc过度使用有两个主要(潜在)优势NotImplementedError.

首先,您将无法实例化抽象类(不需要__init__hacks):

>>> MyAbstractClass()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class MyAbstractClass with abstract methods my_abstract_method
Run Code Online (Sandbox Code Playgroud)

其次,您将无法实例化任何未实现所有抽象方法的子类:

>>> class MyConcreteClass(MyAbstractClass):
...     pass
... 
>>> MyConcreteClass()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class MyConcreteClass with abstract methods my_abstract_method
Run Code Online (Sandbox Code Playgroud)

这是一个关于抽象基类的更完整的概述