Python 如何实例化分派给方法所需的类?
我有一个调度器,其中一个字典包含键,每个键都有一个要调用的方法/函数列表Python 如何实例化分派给方法所需的类?,python,python-3.x,Python,Python 3.x,我有一个调度器,其中一个字典包含键,每个键都有一个要调用的方法/函数列表 operation_request_handlers = { 'permissionsVARVARVARVARGET': [jwtoken.validate, permission_query], 'permissionsVARVARVARVARPOST': [jwtoken.validate, permission_set], 'permissionsVARVARVARVARDELETE': [j
operation_request_handlers = {
'permissionsVARVARVARVARGET': [jwtoken.validate, permission_query],
'permissionsVARVARVARVARPOST': [jwtoken.validate, permission_set],
'permissionsVARVARVARVARDELETE': [jwtoken.validate, permission_delete],
}
如果分派目标是一个函数(即权限查询),或者如果目标是一个静态方法(即jwtoken.validate
),则该方法可以正常工作
问题是我无法解决在jwtoken.validate
不是静态方法的情况下如何调度
据我所知,我首先需要实例化jwtoken
,然后在该实例上调用validate
方法。这对吗?如果我只有jwtoken.validate
,我怎么实例化jwtoken
类呢
更新:很多人都发表了评论,谢谢大家。我目前的想法是,我应该将有效的分派目标限制为可调用对象。您需要提前创建实例并存储绑定的方法,或者稍后将该方法绑定到实例 如果您只需要一个实例,则可以使用第一个实例;然后可以简单地查找方法并将其存储在映射中:
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
第一个参数传入实例),而在类上查找方法会生成未绑定方法(如果使用Python 3,则只需函数)您需要显式地传入第一个参数。您可以使用特殊属性从给定该类的方法对象的类实例化对象:
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
我不确定这个问题的“正确”答案是什么,但最终我使分派目标不是一个方法而是一个类
一旦我这样做了,一切都很好,我可以直接分派给类。那么,创建这样一个实例需要哪些参数?实例状态是否每次都必须改变,或者只能为方法创建一个实例?我将HTTP请求对象传递给目标。这是方法参数,而不是类,对吗?因为se a方法不是孤立存在的;它们绑定到一个实例是有原因的。如果没有关于这里所涉及的类的任何信息,我们几乎无法提供帮助。在我们探索实例化该类的方法之前,也许您可以解释最终目标是什么,我们可能会想出更优雅的名称ttribute是
\uuuu class\uuuuu
;im\u class
是一个现在已经弃用的Python 2名称……假设类构造函数不带参数,也就是说。@martijnpieter它们与\uu class\uuuuu
不同,它们将返回方法类,例如instancemethod
。没有与im\u class完全对应的类代码>在Python 3中。@martineau你是对的,但我们必须假设一些东西。@selcuk谢谢,但我使用的是Python 3-就我所知,这个解决方案就是Python 2。我认为解决这个问题的办法是只允许对未绑定的函数进行分派,如果函数需要一个新对象,那么它就可以实例化它。@DukeDougal:你可以o使用lambda;lambda*args:jwtoken().validate(*args)
每次都会创建一个新实例。再次假设您不需要为类提供任何参数。