предположите, что я хочу создать абстрактный класс в Python с некоторыми методами, которые будут реализованы подклассами. (в Python)
например:
class Base():
def f(self):
print "Hello."
self.g()
print "Bye!"
class A(Base):
def g(self):
print "I am A"
class B(Base):
def g(self):
print "I am B"
Я хотел бы это, если базовый класс инстанцируют и его f () названный метод, когда g () называют, исключение для повышения, сообщая, что подкласс должен иметь реализованный метод g ().
Что обычная вещь состоит в том, чтобы сделать здесь? Я должен повысить NotImplementedError? или есть ли более особенный метод выполнения его?
Большое спасибо!
Manuel
В Python 2.6 и выше, вы можете использовать модуль abc , чтобы сделать Base
«фактически» абстрактным базовым классом:
import abc
class Base:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def g(self):
pass
def f(self): # &c
это гарантирует, что Base
не может быть создан - и ни то, ни другое не может любой подкласс, который не может переопределить g
- при достижении цели @Aaron разрешить подклассам использовать super
в их реализациях g
. В целом, это гораздо лучшее решение, чем то, что мы использовали в Python 2.5 и ранее!
Дополнительное примечание: наличие наследования Base от объекта было бы излишним, потому что метакласс в любом случае нужно установить явно.
Создайте метод, который ничего не делает, но по-прежнему имеет строку документации, объясняющую интерфейс. Получение NameError
сбивает с толку, а повышение NotImplementedError
(или любого другого исключения, если на то пошло) нарушит правильное использование super
.
Питер Норвиг дал решение этой проблемы в своем списке нечасто задаваемых вопросов Python . Я воспроизведу это здесь. Проверьте качество воздуха в помещении, это очень полезно.
## Python
class MyAbstractClass:
def method1(self): abstract
class MyClass(MyAbstractClass):
pass
def abstract():
import inspect
caller = inspect.getouterframes(inspect.currentframe())[1][3]
raise NotImplementedError(caller + ' must be implemented in subclass')