我有一个调度程序,其中一个字典包含键,每个键都有一个要调用的方法/函数列表。
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
课程?
更新:很多人评论说谢谢大家。我目前的想法是,我应该将有效的调度目标限制为可调用目标。
答案 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)
我不确定这个“正确”的答案是什么,但最后我将调度目标不是一个方法而是一个类。
一旦我这样做,一切都很好,我可以直接派遣到班上。