Попытка использовать декоратор наследуемого класса. 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 шт):

Автор решения: eri

Декораторы методов проставляются до инициализации - поэтому обычный метод там работать не будет даже внутри одного класса без наследования.

Будет работать с 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
→ Ссылка