繁体   English   中英

Python:将类实例函数存储在dict中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM