いくつかの異なるケースタイプのハンドラーを作成する必要があります(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つの質問があります。
- 2つのアプローチのどちらがよりPythonicですか?と
- 最初のものを実装する方法は?