[英]Python : storing class instance function in dict
我尝试编写一个ChatBot程序,该程序将以不同的方式响应每个用户。 因此,我这样实现:当有一个新用户时,请机器人执行某项操作,而我的机器人需要向用户询问更多信息并等待响应消息,我的代码将使用user_id和value的键注册一个字典。类User的call_back函数的功能,例如下面的示例代码。
class User:
api_dict = {}
def __init__(self, user_id):
self.user_id = user_id
def ask_username(self,chat_env):
chat_env.send_msg(self.user_id,"Please enter your username")
api_dict[self.user_id] = self.ask_birth_date
def ask_birth_date(self,message,chat_env)
chat_env.send_msg(self.user_id,"Mr. {} what is your birth date".format(message))
# do some thing
def hook_function(user_id,message,chat_env)
if is_first_hook(user_id):
user = User(user_id)
user.ask_username()
else:
User.api_dict[user_id](message,chat_env)
但是它不起作用,因为python抛出了一个错误,即它在ask_birth_date()
中没有接收chat_env
参数,在该参数中,我认为self
并未传递给函数。 那么有什么方法可以使self
仍然与ask_birth_date()
?
我认为您必须将User
所有实例存储在某个地方,以便在首次建立连接时能够调用ask_username
。 因此,您可以将api_dict
转换为状态模式 。
Users = {} # I'm guessing you already have this!
class User:
def __init__(self, user_id):
self.user_id = user_id
def ask_username(self, chat_env):
chat_env.send_msg(self.user_id, "Please enter your username")
self.current = self.ask_birth_date
def ask_next_question(self, message, chat_env)
self.current(message, chat_env)
def ask_birth_date(self, message, chat_env)
chat_env.send_msg(self.user_id, "Mr. {} what is your birth date".format(message))
self.current = self.record_birth_date # for example
# There must be code that does this already
def new_connection(user_id, chat_env):
Users[user_id] = User(user_id)
Users[user_id].ask_username(chat_env)
# I assume this is called for every message that arrives from a user
def hook_function(user_id, message, chat_env)
Users[user_id].ask_next_question(message, chat_env)
更新:
您的钩子函数未正确调用ask_username()
。 这就是为什么您得到错误。 这就是为什么您应该发布所有代码和整个堆栈跟踪的原因!
此代码应修复您的呼叫站点:
def hook_function(user_id, message, chat_env)
if is_first_hook(user_id):
user = User(user_id)
user.ask_username(chat_env) # add param here!
# btw the user instance here is thrown away!
else:
User.api_dict[user_id](message, chat_env)
如果上述方法解决了您的问题,则意味着不需要User
类。 您可以只将api_dict
作为全局api_dict
,并且这些方法可以成为自由函数。
您的代码可以简化为:
api_dict = {}
def ask_username(chat_env, user_id):
chat_env.send_msg(user_id, "Please enter your username")
api_dict[user_id] = ask_birth_date
def ask_birth_date(chat_env, user_id, message)
chat_env.send_msg(user_id, "Mr. {} what is your birth date".format(message))
# do some thing
def hook_function(user_id, message, chat_env)
if is_first_hook(user_id):
ask_username(chat_env, user_id)
else:
api_dict[user_id](chat_env, user_id, message)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.