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:バインドされていないメソッドhandleStuff()は、最初の引数としてHandler_Case1インスタンスを使用して呼び出す必要があります(代わりにタプルインスタンスを取得します)

もう1つのオプションは、次に示すように、抽象関数を模倣することです( "Q:Pythonで抽象クラスを0行のコードで実装できますか?"):

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

したがって、実際には、2つの質問があります。

  1. 2つのアプローチのどちらがよりPythonicですか?と
  2. 最初のものを実装する方法は?
4

1 に答える 1

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()
于 2009-04-12T20:50:25.977 に答える