Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实例化分派给方法所需的类?_Python_Python 3.x - Fatal编程技术网

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)
每次都会创建一个新实例。再次假设您不需要为类提供任何参数。