python—将附加引用参数作为参数传递给类中的回调对象

ldioqlga  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(377)

我使用的库在对象初始化期间接受一些关键字参数。这些关键字参数定义在特定事件发生时调用的回调对象/函数。回调对象本身需要引用调用它们的对象,并具有一些来自类/对象示例本身的附加数据。
我想做的是在初始化时将对另一个对象的引用传递到其中一个回调中,以避免使用全局变量。
如何/在何处传递对对象的引用?我需要子类化吗?如果我确实需要子类化,我可以在不理解类/库背后的工作的情况下完成这项工作吗?我试着查看源代码,试图找出一些问题,但不幸的是,这有点超出了我的理解。
希望能让我的观点得到理解的示例:

def One(eI):
    *...do some stuff...*

def Two(eI, data, ref_I_want_to_add):
    *do some other stuff*

ref_I_want_to_pass = anotherClass(diff_arg,diff_arg2):
    *...you know the deal...*

eI = exampleClass(argOne=One, ..., argN=N)

首先想到的是使用

eI = exampleClass(argOne=One, argTwo=Two(ref_I_want_to_pass), ..., argN)

但这显然不起作用,因为我有 TypeError: argTwo takes 0 positional arguments but 1 was given 更确切地说,我正在使用websocket客户端库,以便创建 WebSocketApp 对象,该对象处理您使用以下对象示例化对象的连接

ws = websocket.WebSocketApp(uri, on_open=on_open, on_message=on_message, on_ping=on_ping)

现在我有一个函数名为 on_message 处理传入的消息,我告诉 ws 对象的示例化期间 WebSocketApp 我想使用这个函数来处理传入的消息,或者更确切地说是如何处理它们。
我想在收到新消息时更新另一个对象,现在我当然可以使用一个全局变量,但这似乎不是正确的方法,如果我可以在初始化消息时传递对该对象的引用就好了 WebSocketApp 对象,类似于:

ws = websock.WebSocketApp(uri, on_message=on_message(ref_to_Obj), on_open=on_open, on_ping=on_ping)

但很明显,这不起作用,因为我又得到了一个 TypeError: argTwo takes 0 positional arguments but 1 was given 错误。
我不完全确定怎么做。我想到了子类化,但即便如此,我还是有点迷茫,我承认子类化是一个我需要做更多工作的主题,我了解它背后的想法,可以完成他们在教程中使用的所有基本示例,但更复杂的类可能会难倒我。

qvsjd97n

qvsjd97n1#

如果希望将局部变量传递给函数,则需要围绕该变量创建闭包。我们可以用 lambda .

eI = exampleClass(argOne=One, ..., argN=lambda x, y: N(x, y, ref_I_want_to_pass))

相关问题