Как использовать декораторы в классе, которые используют инициализацию класса Python?
Есть код телеграм бота с методами с декораторами.
bot = telebot.TeleBot('TOKEN')
@bot.message_handler(commands=['start'])
def start(message):
...
@bot.message_handler()
def echo_message(message):
...
bot.parse_mode = 'html'
bot.infinity_polling(skip_pending=True)
Я хочу вынести всё в класс, чтобы вся инициализация и методы были сгруппированы, но не могу понять, что делать с декораторами @bot.message_handler, так как они используют переменную бота.
Вот, что я примерно пытаюсь сделать:
class TelegramBot:
def __init__(self):
self.bot = telebot.TeleBot('TOKEN')
self.bot.parse_mode = 'html'
@bot.message_handler(commands=['start']) # <- что-то нужно сделать с ботом
def start(self, message):
...
@bot.message_handler() # <- что-то нужно сделать с ботом
def echo_message(message):
...
def run():
self.bot.infinity_polling(skip_pending=True)
Ответы (1 шт):
Автор решения: frslm
→ Ссылка
На Гитхабе нашел репозиторий с проектом, в котором решается эта проблема. Вкратце, создается класс-handler, который обрабатывает сообщения. Например, обработка команды /start:
class CommandHandler(Handler):
def __init__(self, bot):
self.bot = bot
def handle(self):
@self.bot.message_handler(commands=['start'])
def handle(msg) -> None:
if msg.text == '/start':
self.bot.send_message(msg.chat.id, 'Hello! Waiting for other commands')
class MainHandler:
def __init__(self, bot):
self._bot = bot
self._com_handler = CommandHandler(self._bot)
# self._text_handler = MiscTextHandler(self._bot)
# self._inline_query_handler = InlineQueryHandler(self._bot)
def handle(self):
self._com_handler.handle()
# self._text_handler.handle()
# self._inline_query_handler.handle()
class TelegramBot:
def __init__(self):
self._bot = telebot.TeleBot(TELEGRAM_TOKEN)
self._handler = MainHandler(self._bot)
def _start(self) -> None:
self._handler.handle()
def run(self) -> None:
self._start()
self._bot.infinity_polling(skip_pending=True)
bot = TelegramBot()
bot.run()