«Я» теряется при использовании декоратора - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь реализовать декоратор для моего плагина на основе IR C бот.

Добавление команды ("! Command arg1 arg2") на основе имени функции должно выглядеть следующим образом:

class CorePlugin:
    @BotCommand
    def mycommand(self, arguments):
        self.bot.privmsg("#mychannel", "invoked !mycommand %s" % " ".join(arguments))

Декоратор выглядит так:

class BotCommand:
    def __init__(self, func):
        events.add(func.__name__, func)

Добавление команды работает нормально. Это мой Events класс:

class Events:
    def __init__(self):
        self.events = {}

    def add(self, cmd, func):
        self.events[cmd] = func

    def call(self, cmd, args):
        for c, f in self.events.items():
            if c == cmd:
                f(None, args)

Events.call успешно вызывается в моем Bot классе после того, как вошел PRIVMSG, но мне нужно передать фактический объект (из CorePlugin) к моей украшенной функции вручную. В настоящее время это просто None. func.__self__ как-то теряется в процессе.

У вас есть идея, как к этому подойти?

1 Ответ

0 голосов
/ 27 марта 2020

забудьте декоратор
здесь это более неприятно, чем помощь

в __init__ методе CorePlugin put
BotCommand(self.mycommand)

проблема с 1-м решением BotCommand инициализируется до CorePlugin,
, поэтому self не существует.

Таким образом, функция mycommand «запоминает», что ее следует вызывать с CorePlugin объектом в качестве 1-го аргумента

note
Мне пришлось стереть другое решение потому что он не работает
, вызывая __ call, метод __ в BotCommand class НЕ РАБОТАЕТ
, даже если он вызывается, он не работает автоматически получает CorePlugin объект в качестве аргумента
, что происходит исключительно с функциями (которые не могут быть унаследованы)

...