在使用外部函数的局部变量的另一个函数中定义一个函数是非常有意义的,特别是当您将内部函数本身传递给另一部分代码时,就像使用事件订阅一样。
然而,看着你的代码,你所需要的对象和事件之间似乎已经有了直接的关系。我看到C1.method2.RequestEvent
,所以它看起来像RequestEvent
可以很容易地参考C1
。如果是这样的话,那么它可能传递到处理程序,在处理程序看起来是这样的:
def handleResponseEvent(request, response, dnp):
其中dnp
是由事件(C1
)引用的DNPClass
实例。 request
或response
也可能指向DNPClass
,因此您不需要额外的参数。
这将允许您使用相同的处理程序进行订阅,而不管实例如何。例如:
def main():
C1 = DNPClass()
C1.method1(arg1, arg2, arg3, arg4, arg5)
# subscribing to event
C1.method2.RequestEvent += handleResponseEvent # will call C1.method3
C2 = DNPClass()
C2.method2.RequestEvent += handleResponseEvent # will call C2.method3
def handleResponseEvent(request, response):
#code to execute when event handler is called
#code references additional method from current DNPClass instance
request.dnp.method3()
...
如果这也不行,它不是编辑DNPClass
代码可行,使其工作,那么我会至少这个限制就这么你不接受的情况下的单一功能每次都需要定义一个新的内部函数。就像这样:
def subscribe_handleResponseEvent(dnp):
def handleResponseEvent(request, response):
#code to execute when event handler is called
#code references additional method from dnp instance
dnp.method3()
...
dnp.method2.RequestEvent += handleResponseEvent
def main():
C1 = DNPClass()
C1.method1(arg1, arg2, arg3, arg4, arg5)
# subscribing to event
subscribe_handleResponseEvent(C1)
...
建议的功能方法真的很好,因为我没有访问DNPClass或事件处理程序。它也让我很容易实例化其他DNPClass对象并将它们添加到事件处理程序中。 – cjbust