我想根据用户从主菜单中所做的选择调用执行某些操作(存储在类字典中)的类方法。
def setup_task(user_input, id):
#Object
task_data = TaskData(id)
task_steps = tasks(user_input, task_data)
task_steps()
def tasks(user_input, task_data):
"""
Maps user input/task type to methods
"""
tasks = {
"TaskRed": Red(task_data).setup_red_specific_task,
"TaskYellow": Yellow(task_data).setup_yellow_specific_task
}
return tasks.get(user_input)
这是类的外观:
class TaskRed(BaseClass):
def __init__(self, task_data):
super().__init__()
# Used by multiple methods
self.task_data = task_data
def setup_red_specific_task(self):
print("Does something")
这按预期工作。但是,我想避免tasks
在开始时在函数中实例化字典中的所有类。我只想根据 user_input 执行所需的操作。如何避免在开始时为所有任务实例化类?
保存"Red(task_data).setup_red_specific_task"
为字符串并在调用该方法时使用 eval 有效,但是我想避免这样做。
我能想到的最简单的方法是返回一个函数实例,并在检索值时执行它,如下所示:-
def tasks(user_input, task_data):
"""
Maps user input/task type to methods
"""
tasks = {
"TaskRed": lambda: Red(task_data).setup_red_specific_task,
"TaskYellow": lambda: Yellow(task_data).setup_yellow_specific_task
}
return tasks.get(user_input)()
为了解释这一点,我编写了以下示例:-
>>> tasks = {"a": lambda: print("23"), "b": lambda: print("34")}
>>> tasks["a"]
<function <lambda> at 0x7fe21fad45e0>
>>> tasks["a"]()
23
如果你在上面看到我们 print tasks["a"]
,它只给了我们函数实例,并没有实际执行它。但是当我们最后传递“()”时,它实际上执行了该函数并给了我们结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句