【发布时间】:2020-03-27 09:15:13
【问题描述】:
我正在尝试为基于插件的 IRC 机器人实现一个装饰器。
根据函数名称添加命令(“!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 在 PRIVMSG 进入后在我的 Bot 类中被成功调用,但我需要手动将实际对象(CorePlugin)传递给我的装饰函数。目前它只是None。 func.__self__ 在这个过程中不知何故丢失了。
你知道如何解决这个问题吗?
【问题讨论】:
-
Events.call在消息到达某处时被调用?究竟是什么调用了它?
标签: python-3.x decorator