0

我想根据用户从主菜单中所做的选择调用执行某些操作(存储在类字典中)的类方法。

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 有效,但是我想避免这样做。

4

1 回答 1

0

我能想到的最简单的方法是返回一个函数实例,并在您检索值时执行它,如下所示:-

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"],它只给了我们函数实例并没有实际执行它。但是当我们最后传递“()”时,它实际上执行了函数并给了我们结果。

于 2021-06-20T05:03:55.060 回答