Чистые виртуальные методы в Python

Каков идеологически правильный способ реализации чистых виртуальных методов в Python?

Просто поднять NotImplementedError в методах?

Или есть лучший способ?

Спасибо!

Ответ 1

В то время как не редко встречаются люди, использующие NotImplementedError, некоторые утверждают, что "правильный" способ сделать это (поскольку python 2.6 ) использует Абстрактный базовый класс, через модуль abc:

from abc import ABCMeta, abstractmethod

class MyAbstractClass(object):
    __metaclass__=ABCMeta
    @abstractmethod
    def my_abstract_method():
        pass

Есть два основных (потенциальных) преимущества использования abc с использованием NotImplementedError.

Во-первых, вы не сможете создать экземпляр абстрактного класса (без использования __init__ хаков):

>>> 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

Во-вторых, вы не сможете создать экземпляр любого подкласса, который не реализует все абстрактные методы:

>>> 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

Здесь приведен более полный обзор абстрактных базовых классов