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そうです。その場合、それをハンドラーに渡すことができます。ハンドラーは次のようになります。RequestEventC1

def handleResponseEvent(request, response, dnp):

dnpDNPClassイベントによって参照されるインスタンスです ( C1)。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)
    ...
于 2013-10-15T15:37:50.280 に答える
0

handleResponseEventが他の場所で使用されていない場合は、 main. C1それはおそらくグローバルにするよりも優れています。パラメーターとして渡すこともできC1ます (の署名を変更して変更する必要がありますhandleResponseEvent) 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 に答える