2009-04-12 5 views
1

私はいくつかの異なるケースタイプ(Pythonで)のハンドラを書く必要があります。これらすべてのタイプのインターフェースは同じですが、処理ロジックは異なります。カプセル化対継承、選択の助けになります

1つのオプションは、__init__のパラメータの1つとして、特定のハンドラタイプを受け取り、共通のクラスを定義することになります。

class Handler: 
    def __init__ (self, handlerType): 
     self._handlerType = handlerType 
     self._handler = handlerType.handleStuff 

    def handleStuff(self, *args, **kwargs): 
     return self._handler(args, kwargs) 


# case specific handlers 

class Handler_Case1: 
    def handleStuff(self, *args, **kwargs): 
     print 'Handling Case 1' 


class Handler_Case2: 
    def handleStuff(self, *args, **kwargs): 
     print 'Handling Case 2' 



if __name__ == '__main__': 
    handlers = [] 
    handlers.append(Handler(Handler_Case1)) 
    handlers.append(Handler(Handler_Case2)) 
    for h in handlers: 
     h.handleStuff() 

しかし、これはTypeError例外で結果:

TypeError: unbound method handleStuff() must be called with Handler_Case1 instance as first argument (got tuple instance instead)

別のオプションですhere( "Q:0行のコードで抽象クラスをPythonで実装できますか?"):

class Handler: 
    def handleStuff(self, *args, **kwargs): abstract 
    def commonFunction(self): 
     print 'Common function' 


# case specific handlers 

class Handler_Case1(Handler): 
    def handleStuff(self, *args, **kwargs): 
     print 'Handling Case 1' 


class Handler_Case2(Handler): 
    def handleStuff(self, *args, **kwargs): 
     print 'Handling Case 2' 



if __name__ == '__main__': 
    handlers = [] 
    h1 = (Handler_Case1()) 
    h2 = (Handler_Case2()) 
    handlers.append(h1) 
    handlers.append(h2) 
    for h in handlers: 
     h.handleStuff() 
     print 
のように抽象関数を模倣します。
  1. 2つのアプローチのより神託です:

    だから、実際に、私は2つの質問がありますか? と

  2. 最初の実装方法は?

答えて

4

私はあなたの質問では、いくつかの微妙な複雑さが欠けますが、あなたの最初の例を与えられるかもしれない、何がこのような何かやってからあなたを排除:

class HandlerCase1(object): 
    def handle_stuff(self, *args, **kwargs): 
     print "Handling case 1" 


class HandlerCase2(object): 
    def handle_stuff(self, *args, **kwargs): 
     print "Handling case 2" 


if __name__ == "__main__": 
    handlers = [] 
    handlers.append(HandlerCase1()) 
    handlers.append(HandlerCase2()) 
    for h in handlers: 
     h.handle_stuff() 

をそして、あなたは、クラスにはいくつかの共通を共有したい場合は(ベース)機能を使用している場合、これを行うことからあなたを守る何かがあります:

class Handler(object): 
    def common_function(self): 
     print "Common function" 


class HandlerCase1(Handler): 
    def handle_stuff(self, *args, **kwargs): 
     print "Handling case 1" 


class HandlerCase2(Handler): 
    def handle_stuff(self, *args, **kwargs): 
     print "Handling case 2" 


if __name__ == "__main__": 
    handlers = [] 
    handlers.append(HandlerCase1()) 
    handlers.append(HandlerCase2()) 
    for h in handlers: 
     h.handle_stuff() 
     h.common_function() 
関連する問題