我可以绕过将 self 对象传递给 python 类方法吗?

Posted

技术标签:

【中文标题】我可以绕过将 self 对象传递给 python 类方法吗?【英文标题】:can I bypass passing self object to a python class method? 【发布时间】:2020-09-25 17:59:02 【问题描述】:

我正在使用谷歌课堂 api,函数的参数之一需要回调。

def callback(request_id, response, exception):
    if exception is not None:
        print 'Error adding user "0" to the course course: 1'.format(
            request_id, exception)
    else:
        print 'User "0" added as a student to the course.'.format(
            response.get('profile').get('name').get('fullName'))

在我的情况下,该方法在一个类中,并且我知道每个 python 方法都应该采用一个 self 对象,但在这种情况下,这个函数将具有特定的参数,我不确定如何传递 self 对象或者我应该忽略 self ?问题是我计划在函数内部使用 self 。 有什么想法吗?

【问题讨论】:

您不需要显式传递self。但是由于callback没有self作为它的第一个参数,你确定它没有用@staticmethod注解吗? 你说的是什么方法?您可以将 绑定 方法作为参数 (somefunc(some_obj.method)) 传递,也可以将方法调用包装在函数中 (somefunc(lambda *args: some_obj.method(*args))),具体取决于您的需要。 出于这个确切原因,我试图理解@static and @class 方法。公平地说,我不确定是否真的需要使用这些装饰器。 【参考方案1】:

我想我理解你的困境。继续并包含self 作为第一个参数,因为每次调用callback() 时,Python 都会隐式传递它。所有其他位置参数(request_idresponseexception)不会受到在方法参数定义中包含 self 的影响。即:

def callback(self, request_id, response, exception):
    # ...

如果你不打算在 callback 方法(现在是一个函数)中使用 self 对象,那么你可以在函数定义中使用 @staticmethod 装饰器,但如果我直接关注你,这里不是这样。

编辑:如果您需要在不影响回调性质的情况下传递特定参数,您可以使用来自functools 模块的partial。我将执行以下操作(在此示例中,我使用参数request_id,但它可以是任何其他参数):

from functools import partial

partial_callback = partial(callback, request_id='12345')

现在,您可以在需要传递特定参数(在我的示例中为 request_id)的任何地方传递 partial_callback 而不是 callback

请注意:如果您想传递未在原始callback 函数中定义的参数,则会引发TypeError。如果是这种情况,则使用特殊语法**kwargs 重新定义callback,以便callback 现在接受一个带关键字的可变长度参数,该参数将作为键值对存储在名为@987654343 的字典中@。

请注意,为了在函数定义中使用参数,您必须将它们称为kwargs['whatever_argument_name'](就像使用任何字典一样)

因此,例如,如果您想传递一个名为 extraparam 的参数,那么您需要如下所示:

def callback(self, request_id, response, exception, **kwargs):
    # ...
    extraparam = kwargs.get('extraparam')
    if extraparam is not None:
        # ...

partial_callback = partial(callback, extraparam='whatever')

【讨论】:

谢谢。你是对的,它确实没有任何问题。但现在我想给它传递一个参数。 Callback 像这样调用 batch.execute(callback=callback)。有什么办法可以让它通过参数吗?我的批处理请求在不同的线程中执行。有没有办法让我只为那个线程存储一些东西? 嘿,伙计!也许使用partial?这似乎是一个完美的案例。您可以从functools 模块导入它。 所以就像def callback (self, reqid,resp,excep, extrapaeam): pass test = partials(callback, req, resp ,except) 并且从批次中是batch.append(bla, callback=test(extrapaeam) ?像这样的东西?老实说,我无法理解它。这是准确的吗?为混乱道歉。在一部破烂不堪的手机上。 哦,没问题!相反,鉴于你的情况,我很佩服你的坚韧。让我更新我的答案以说明partial 的用法。希望这就是您所需要的。

以上是关于我可以绕过将 self 对象传递给 python 类方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

将当前单击的按钮作为参数传递给 Kivy (Python) 中的 on_press

Python:如何将多个参数传递给属性 getter?

是否可以将类类型的对象作为参数传递给另一个类,这样我就不必再次初始化? (Python 3.x)

可以在Python中将参数传递给函数对象吗?

将 multiprocessing.Value 对象传递给 ctype 函数?

将进程中的连接对象传递给python中的主进程