
[code]

    class BaseHandler:
        def __init__(self):
            setup()
            try:
                handle()
            finally:
                finish()
    
        def setup(self):
            pass
    
        def handle(self):
            pass
    
        def finish(self):
            pass
    
[/code]

の `handle` に前処理を追加し，継承先では前処理が行われた状態で `handle`
の処理を開始したいです。この場合は，どのように記述すればよいでしょうか。

具体的には，

[code]

    class MessageHandler(socketserver.BaseRequestHandler):
        def handle(self):
            with pickle.loads(self.request.recv(1024)) as message:
                pass
    
[/code]

を継承し，

[code]

    class ChildMessageHandler(socketserver.BaseRequestHandler):
        def handle(self):
            if isinstance(massage, Message):
                print(message.text)
    
[/code]

というような使い方をしたいです。`setattr` を使って前処理の結果を属性に加えるなども考えています。

この場合，どのように記述するのが適切でしょうか。


CC BY-SA 3.0
2016-10-01T13:44:04.687
29285
2016-10-23T13:32:04.513
2016-10-01T14:24:59.757
3132
3132
question
python
ハンドラに前処理を追加したい


定義している`MessageHandler`を継承して、そこで定義しているhandle()内のものを実行したあと、追加処理を行いたいのであれば、`super()`を使用できますが、親クラスに定義している尾オブジェクトが渡されないですね。`._message`とかに保存したりできると思いますが、呼ばれる準備によってその値が変われる可能性が高いですね。

なので、別メッソッドを用意すればいいかもしれません。  
こちらはどうでしょうか？

[code]

    class MessageHandler(socketserver.BaseRequestHandler):
        def _prepare_message(self):
            return pickle.loads(self.request.recv(1024))
    
    class ChildMessageHandler(MessageHandler):
        def handle(self, *args, **kwargs):
            message = self._prepare_message()
            if isinstance(message, Message):
                print(message.text)
    
[/code]

`super()`を使った例：

[code]

    class ChildMessageHandler(MessageHandler):
        def handle(self, *args, **kwargs):
            super().handle(*args, **kwargs)  # 親のhandle()を実行
            #　続きのコードはこちら
    
[/code]


CC BY-SA 3.0
2016-10-03T08:30:53.280
29319
2016-10-23T13:32:04.513
2016-10-23T13:32:04.513
2314
2314
29285
answer