2013-10-15 50 views
0

我在下面有下面的代码。当事件被触发时,我想在handleResponseEvent()内执行额外的C1类方法。试验我发现,如果我在main()里面定义handleResponseEvent(),它就是我想要的。我想知道是否有其他方法做同样的事情,如果在main()里定义事件处理函数是最好的方法。函数内函数最佳方法?

def main(): 
    C1 = DNPClass() 
    C1.method1(arg1, arg2, arg3, arg4, arg5) 

    # subscribing to event 
    C1.method2.RequestEvent += handleResponseEvent 
    ... 

def handleResponseEvent(request, response): 
    #code to execute when event handler is called 
    #code references additional method from C1 instance 
    .... 

回答

2

在使用外部函数的局部变量的另一个函数中定义一个函数是非常有意义的,特别是当您将内部函数本身传递给另一部分代码时,就像使用事件订阅一样。

然而,看着你的代码,你所需要的对象和事件之间似乎已经有了直接的关系。我看到C1.method2.RequestEvent,所以它看起来像RequestEvent可以很容易地参考C1。如果是这样的话,那么它可能传递到处理程序,在处理程序看起来是这样的:

def handleResponseEvent(request, response, dnp): 

其中dnp是由事件(C1)引用的DNPClass实例。 requestresponse也可能指向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) 
    ... 
+0

建议的功能方法真的很好,因为我没有访问DNPClass或事件处理程序。它也让我很容易实例化其他DNPClass对象并将它们添加到事件处理程序中。 – cjbust

0

如果handleResponseEvent不使用其他任何地方,它也可能是main。这可能比制作C1全球更好。您也可以通过C1作为参数(您必须更改handleResponseEvent的签名并修改method2.RequestEvent)。

0

我会采取这种方法唯一的问题是,我不会在main函数中这样做,否则它是完全有效的。

这就是我所说的功能方法;一个面向对象的方法将使handleResponseEventDPNClass的方法,使代码看起来像

def main(): 
    C1 = DNPClass() 
    C1.method1(arg1, arg2, arg3, arg4, arg5) 

    # subscribing to event 
    C1.method2.RequestEvent += C1.handleResponseEvent 
    ... 

class DPNClass(...): 
    ... 
    def handleResponseEvent(self, request, response): 
     #code to execute when event handler is called 
     #code references additional method from self instance 
     .... 

这当然是可能的,只有你的类DPNClass是你的,你可以修改它的;否则你可以创建你自己的类并在那里包装C1。