我正在尝试将Slack API的V2包装到一个类中,以便可以封装有关我的机器人的信息。这是他们的示例片段之一:
import slack
slack_token = os.environ["SLACK_API_TOKEN"]
rtmclient = slack.RTMClient(token=slack_token)
@slack.RTMClient.run_on(event='message')
def say_hello(**payload):
data = payload['data']
if 'Hello' in data['text']:
channel_id = data['channel']
thread_ts = data['ts']
user = data['user']
webclient = payload['web_client']
webclient.chat_postMessage(
channel=channel_id,
text="Hi <@{}>!".format(user),
thread_ts=thread_ts
)
rtmclient.start()
我在这里的理解是由于装饰器的原因,此say_hello
函数正在传递到slack对象中,因此,如果我将其包装到一个类中,则该函数并不是真正位于我的类中。如何包装say_hello
函数,使其能够调用属于我的类实例的方法和引用属性?
答案 0 :(得分:1)
看看装饰器是如何工作的!
def decorator_factory(f):
def decoration(*args, **kwargs):
print('before')
r = f(*args, **kwargs)
print('after')
return r
return decoration
@decorator_factory
def inc(i):
'''
>>> inc(23)
before
after
42
'''
return i + 1
也许有更好的,规范的方法来实现您想要的目标,但这可以完成工作:
class Client():
def __init__(self):
slack.RTMClient.run_on(event='message')(self.decorated)
def decorated(self, x, y, z):
pass
答案 1 :(得分:1)
他们的关键是根本不使用装饰器。
在Markus的解决方案中,只需直接调用“ run_on”函数,然后再调用“ start”函数,如下所示:
rtmclient = slack.RTMClient(token=self.Token)
rtmclient.run_on(event='message')(self.handle_command)
rtmclient.start()