2013-10-15 55 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。

相關問題