以编程方式读取类中的函数列表,并根据函数名

时间:2017-04-18 05:24:56

标签: python

我试图避免拥有一个巨大的if-else代码列表。

基本上我根据输入有一组应该运行的指令。想象一下,为了简单起见,公共办公室根据公民身份,健康状况等发布驾驶执照。

我现在使用的条件是一个字符串,所以我使用一个接受字符串作为参数的函数;在函数内部,我通过if-else序列找到运行一系列命令的相应函数。如果添加了新活动,我会在活动执行程序中添加一个新函数,其中包含要运行的指令,以及一个带有用于运行该函数的字符串的新elif

def activity_manager(self, type_of_activity):

    if type_of_activity == "citizen":
        activity_executor.license_standard()
    elif type_of_activity == "senior":
        activity_executor.license_senior()
    elif [...]
       [ other cases, there are plenty]
    else:
        [ If there is no action associated print a message]


class activity_executor:

    def license_senior(self)
        [ Do stuff for the senior license]

    def license_standard(self)
        [ Do stuff for standard license]

    [ ... more functions that does something else]

现在,这种方法的问题在于,这很容易失控。

相反,我希望做一些不同的事情;一些动态的东西,比如在activity_executor类中进行内省,读取函数的名称;并根据我想要运行的函数执行正确的函数;像这样:

activity_executor(license_standard)

如果该类中存在该函数,则执行该函数;否则我收到一条消息,说没有这样的功能。通过这种方式,我可以摆脱activity_manager函数,只需要一个接受函数名作为参数的泛型函数;因此,如果我在该课程中添加更多功能,我不必在任何地方添加if-elif条件。这也将消除处理不存在该功能的情况的担忧。

这在Python中可行吗?

2 个答案:

答案 0 :(得分:0)

您可以使用getattr,例如:

try:
    function = getattr(activity_executor, 'license_' + type_of_activity)
    assert callable(function)  # make sure it is a function
                               # or a callable in general
except AttributeError:
    pass # function not found print a message
else:
    # found function call it
    function()

答案 1 :(得分:0)

如果您知道您获得的参数与您想要执行的功能之间存在一对一的匹配,例如

activity_executor('standard') # execute license_standard
activity_executor('senior')   # execute license_senior

然后,如果您使用getattr():

知道其名称,则可以调用该方法
class activity_executor:
    def activity_executor(self, activity):
      getattr(self, 'license_' + activity)()

那就是说,这样你就可以非常紧密地结合参数和方法名称,这可能会使未来的进化成为一场噩梦。我建议改用字典,这样你就可以在一个地方定义所有业务规则:

activities={
    'senior' => 'license_senior',
    'citizen' => 'license_citizen',
    # many more lines
}

然后你可以使用getattr:

class activity_executor:
    def activity_executor(self, activity):
        method=activities[activity]
        getattr(self, method)()

您可以先使用hasattr()确认方法是否存在。

适用于pyhton 2& 3。