Что такое идеологически правильный способ реализации простых виртуальных методов в Python?Чистые виртуальные методы в Python
Только повышение NotImplementedError
в методах?
Или есть лучший способ?
Спасибо!
Что такое идеологически правильный способ реализации простых виртуальных методов в Python?Чистые виртуальные методы в Python
Только повышение NotImplementedError
в методах?
Или есть лучший способ?
Спасибо!
Хотя это не редкость увидеть people using NotImplementedError
, некоторые будут утверждать, что «правильный» способ сделать это (с Python 2.6) использует абстрактный базовый класс через abc
module:
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