Каков идеологически правильный способ реализации чистых виртуальных методов в 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