在使用外部函數的局部變量的另一個函數中定義一個函數是非常有意義的,特別是當您將內部函數本身傳遞給另一部分代碼時,就像使用事件訂閱一樣。
然而,看着你的代碼,你所需要的對象和事件之間似乎已經有了直接的關係。我看到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