如何实例化需要分派给方法的类?

2024-04-26 18:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dispatcher,其中一个字典包含键,每个键都有一个要调用的方法/函数列表。你知道吗

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

如果分派目标是一个函数(即permission\u query),或者如果目标是一个静态方法(即jwtoken.validate),那么这种方法可以很好地工作。你知道吗

问题是我无法解决在jwtoken.validate不是静态方法的情况下如何调度。你知道吗

据我所知,我首先需要实例化jwtoken,然后在该实例上调用validate方法。是这样吗?如果我只有jwtoken.validate,我怎么实例化jwtoken类呢?你知道吗

更新:很多人都发表了评论,谢谢大家。我目前的想法是,应该将有效的分派目标限制为callable。你知道吗


Tags: 实例方法函数分派目标列表字典request
3条回答

我不确定这个问题的“正确”答案是什么,但最终我使分派目标不是一个方法而是一个类。你知道吗

一旦我做了,一切都很好,我可以直接派到班上。你知道吗

您需要先创建实例并存储绑定的方法,或者稍后将方法绑定到实例。你知道吗

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

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()类不接受任何附加参数。你知道吗

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

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第一个参数传入实例),在类上查找方法会生成一个未绑定的方法(如果您使用的是python3,则只需函数),并且需要显式传入第一个参数。你知道吗

您可以使用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

相关问题 更多 >