Скажем, у меня есть базовый класс:
class Task:
def run(self):
#override this!
Теперь я хочу, чтобы другие создали подкласс Task и переопределили метод run():
class MyTask(Task):
def run(self):
#successful override!
Однако проблема в том, что существует логика, которая должна выполняться до и после метода run() каждого класса, являющегося подклассом Task.
Похоже, что один из способов сделать это — определить другой метод в базовом классе, который затем вызывает метод run(). Однако я хотел спросить, есть ли способ добиться этого с помощью декораторов? Каким был бы самый пифонический способ сделать это?
__new__
используется в метаклассах, а не__init__
- это получается намного чище. 18.09.2013__new__
существует в Python, заключается в том, что неизменяемые типы могут сохранять свою неизменность, позволяя создавать подклассы. (Если бы не было__new__
, а неизменяемые использовали__init__
, тогда вы могли бы изменить значение неизменяемых, вызывая такие вещи, какmath.pi.__init__(3.0)
!) Поэтому я считаю, что вы должны зарезервировать__new__
только для тех ситуаций, когда вы хотите, чтобы экземпляры были неизменяемыми. 18.09.2013before
илиafter
. Что мне не хватает? 05.09.2017metaclass=MetaTask
в базовое объявление класса. Я отредактировал сообщение выше, чтобы показать, что я имею в виду. 05.09.2017