我可以绕过将 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_id
、response
和 exception
)不会受到在方法参数定义中包含 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 3.x)