将附加引用参数作为参数传递给 class 中的回调对象
Passing additional reference parameters as arguments to a callback object in a class
我正在使用一个库,该库在对象初始化期间采用一些关键字参数。这些关键字参数定义了特定事件发生时调用的回调 objects/functions。回调对象本身需要引用调用它们的对象,并有一些来自 class/object 实例本身的额外数据。
我想做的是在初始化时将对另一个对象的引用传递给这些回调之一,以避免使用全局变量。
How/where 我会传递对对象的引用吗?我需要子类化吗?如果我确实需要子类化,我可以在不了解 class/library 背后的工作的情况下完成吗?我试着查看源代码以尝试找出一些东西,但不幸的是,这有点超出了我的理解范围。
希望能传达我的观点的示例:
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
的函数来处理传入的消息,我在实例化 WebSocketApp
期间告诉 ws
对象我想使用该函数来处理传入消息或如何处理它们。
我想在收到新消息时更新另一个对象,现在我当然可以为此使用全局变量,但这似乎不是正确的方法,如果我可以在初始化 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
错误。
我不太确定该怎么做。想到了子类化,但即便如此我还是有点迷茫,我承认子类化是一个我需要做更多工作的主题,我了解它背后的想法并且可以完成他们在教程中使用的所有基本示例但更复杂 类 难倒我了。
如果要将局部变量传递给函数,则需要围绕该变量创建一个闭包。我们可以用 lambda
.
来做到这一点
eI = exampleClass(argOne=One, ..., argN=lambda x, y: N(x, y, ref_I_want_to_pass))
我正在使用一个库,该库在对象初始化期间采用一些关键字参数。这些关键字参数定义了特定事件发生时调用的回调 objects/functions。回调对象本身需要引用调用它们的对象,并有一些来自 class/object 实例本身的额外数据。
我想做的是在初始化时将对另一个对象的引用传递给这些回调之一,以避免使用全局变量。
How/where 我会传递对对象的引用吗?我需要子类化吗?如果我确实需要子类化,我可以在不了解 class/library 背后的工作的情况下完成吗?我试着查看源代码以尝试找出一些东西,但不幸的是,这有点超出了我的理解范围。
希望能传达我的观点的示例:
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
的函数来处理传入的消息,我在实例化 WebSocketApp
期间告诉 ws
对象我想使用该函数来处理传入消息或如何处理它们。
我想在收到新消息时更新另一个对象,现在我当然可以为此使用全局变量,但这似乎不是正确的方法,如果我可以在初始化 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
错误。
我不太确定该怎么做。想到了子类化,但即便如此我还是有点迷茫,我承认子类化是一个我需要做更多工作的主题,我了解它背后的想法并且可以完成他们在教程中使用的所有基本示例但更复杂 类 难倒我了。
如果要将局部变量传递给函数,则需要围绕该变量创建一个闭包。我们可以用 lambda
.
eI = exampleClass(argOne=One, ..., argN=lambda x, y: N(x, y, ref_I_want_to_pass))