Я пытаюсь найти хороший способ легко зарегистрировать обработчики некоторых команд в классе Python.Эти обработчики будут зарегистрированы для подклассов SomeBaseClass
и доступны только там.К сожалению, я начинаю думать, что делаю больше работы, чем необходимо.Прямо сейчас у меня есть:
def register_handlers(cls):
cls._handlers = {}
for method in cls.__dict__.values():
if hasattr(method, "handler_name"):
cls._handlers[method.handler_name] = method
return cls
class SomeBaseClass(object):
_handlers = None
def __init__(self):
for h in self._handlers:
self._handlers[h] = types.MethodType(self._handlers[h], self, SomeBaseClass)
def run_action(self, name, *args):
return self._handlers[name](*args)
def actual_handler_wrapper(f):
....
f.handler_name = name
....
Здесь есть несколько проблем:
- и класс, и его обработчики должны быть украшены
- второй уровень подклассов недоступен (
_handlers
должен быть назначен и проверен на каждом уровне наследования) - привязка обработчиков к классу во время инициализации кажется грязной ...
Есть ли способ улучшить это?Я мог бы, вероятно, избавиться от register_handlers
, изменив SomeBaseClass
на мета-класс.Он также может связывать обработчики во время создания класса.Но это кажется еще более сложным, чем нынешний подход.
Есть ли какой-нибудь более легкий выход?
Редактировать: Пример использования:
@register_handlers
class SubClass(SomeBaseClass):
@actual_handler_wrapper
def handler(self):
...