Попытка использовать декоратор наследуемого класса. RuntimeError: super(): no arguments
Есть класс VkBot, который содержит декоратор handler.
При наследовании из этого класса необходимо получить доступ к этому декоратору.
Но проблема в том, что декоратор используется до инициализации, поэтому я не могу использовать super() в __init__
Ниже привожу частичный код
class VkBot:
def handler(self, command: str):
def wrapper(func):
return func
class MyBot(VkBot):
_handler = super().handler
@_handler("!setclass")
def setclass(self):
pass
Напрашивается засунуть handler в класс MyBot, но проблема в том, что с точки зрения ООП декоратор handler не разделимо связан с VkBot
Полный код я залил в архив.
Пожалуйста, подскажите решение этой проблемы
Ответы (1 шт):
Декораторы методов проставляются до инициализации - поэтому обычный метод там работать не будет даже внутри одного класса без наследования.
Будет работать с staticmethod
class VkBot:
@staticmethod
def handler(command: str):
def wrapper(func):
return func
return wrapper
class MyBot(VkBot):
@VkBot.handler("!setclass")
def setclass(self):
pass
Для Вашего примера больше подойдет карирование и патчинг в инит
class VkBot:
def handler(self, command: str):
def wrapper(func):
return func
return wrapper
class MyBot(VkBot):
def __init__(self):
self.setclass = self.handler("!setclass")(self.setclass)
def setclass(self):
pass