0

我在下面有以下代码。我想在 handleResponseEvent()触发事件时在内部执行其他 C1 类方法。实验我发现如果我handleResponseEvent()在里面定义main()它会做我想要的。我想知道是否还有其他方法可以做同样的事情,以及在内部定义事件处理函数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
    ....
4

3 回答 3

2

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

但是,查看您的代码,您需要的对象和事件之间似乎已经存在直接关系。我明白C1.method2.RequestEvent了,所以看起来RequestEvent可以很容易地引用C1. 如果是这种情况,那么它可以将其传递给处理程序,处理程序看起来像这样:

def handleResponseEvent(request, response, dnp):

事件引用dnp的实例在哪里( )。也有可能或已经参考了,因此您不需要额外的参数。DNPClassC1requestresponseDNPClass

这将允许您使用相同的处理程序进行订阅,而不管实例如何。例如:

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)
    ...
于 2013-10-15T15:37:50.280 回答
0

如果handleResponseEvent没有在其他任何地方使用,它还不如在main. 这可能比C1全球化更好。您也可以C1作为参数传递(您必须更改handleResponseEvent和 modify的签名method2.RequestEvent)。

于 2013-10-15T15:07:31.627 回答
0

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

这就是我所说的功能方法;OOP 方法将创建handleResponseEvent类的方法DPNClass,因此代码看起来像

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 包装在那里。

于 2013-10-15T15:09:06.647 回答