如何实例化分派到方法所需的类?

时间:2015-03-27 21:55:45

标签: python python-3.x

我有一个调度程序,其中一个字典包含键,每个键都有一个要调用的方法/函数列表。

operation_request_handlers = {
    'permissionsVARVARVARVARGET': [jwtoken.validate, permission_query],
    'permissionsVARVARVARVARPOST': [jwtoken.validate, permission_set],
    'permissionsVARVARVARVARDELETE': [jwtoken.validate, permission_delete],
}

如果调度目标是函数(即permission_query,或者目标是静态方法(即jwtoken.validate),则此方法可以正常工作。

问题是我无法在jwtoken.validate不是静态方法的情况下解决问题。

据我了解,我首先需要实例化jwtoken然后在该实例上调用validate方法。这是正确的吗?鉴于我所拥有的jwtoken,我如何实例化jwtoken.validate课程?

更新:很多人评论说谢谢大家。我目前的想法是,我应该将有效的调度目标限制为可调用目标。

3 个答案:

答案 0 :(得分:1)

您需要预先创建实例并存储绑定的方法,或稍后将该方法绑定到实例。

如果您需要的只是一个实例,那么您将使用第一个实例;然后可以简单地查找这些方法并将其存储在映射中:

a_token = jwtoken()
operation_request_handlers = {
    'permissionsVARVARVARVARGET': [a_token.validate, permission_query],
    'permissionsVARVARVARVARPOST': [a_token.validate, permission_set],
    'permissionsVARVARVARVARDELETE': [a_token.validate, permission_delete],
}

这假设jwtoken()类没有采取任何其他参数。

如果每次都需要 new 实例,则可以将该实例作为存储的未绑定方法的第一个参数传递;

operation_request_handlers = {
    'permissionsVARVARVARVARGET': [jwtoken.validate, permission_query],
    'permissionsVARVARVARVARPOST': [jwtoken.validate, permission_set],
    'permissionsVARVARVARVARDELETE': [jwtoken.validate, permission_delete],
}

method, permission = operation_request_handlers[some_key]
a_token = jwtoken()
result method(a_token, *other_arguments)

在实例上查找方法会生成绑定方法(并且它们将在实例中作为方法的self第一个参数传递),查找类上的方法产生一个未绑定的方法(或者只是你使用Python 3时的函数),你需要显式传入第一个参数。

答案 1 :(得分:0)

您可以使用im_class特殊属性从给定该类的方法对象的类中实例化对象:

operation_request_handlers = {
    'permissionsVARVARVARVARGET': [jwtoken.validate, permission_query],
    'permissionsVARVARVARVARPOST': [jwtoken.validate, permission_set],
    'permissionsVARVARVARVARDELETE': [jwtoken.validate, permission_delete],
}
m = operation_request_handlers[my_key][0]    # jwtoken.validate
obj = m.im_class()      # An instance of jwtoken class 
                        # assuming that the constructor takes no arguments
result = getattr(obj, m.__name__)(request)  # Call method

答案 2 :(得分:0)

我不确定这个“正确”的答案是什么,但最后我将调度目标不是一个方法而是一个类。

一旦我这样做,一切都很好,我可以直接派遣到班上。