J'ai besoin d'écrire des gestionnaires pour plusieurs types de cas différents (en Python). L'interface pour tous ces types est la même, mais la logique de gestion est différente.L'encapsulation par rapport à l'héritage, aide à faire un choix
Une option serait la définition d'une classe commune qui reçoit le type de gestionnaire particulier comme l'un des paramètres __init__:
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()
Cependant, il en résulte une TypeError:
TypeError: unbound method handleStuff() must be called with Handler_Case1 instance as first argument (got tuple instance instead)
Une autre option est pour imiter la fonction abstraite, comme indiqué here ("Q: Pouvez-vous implémenter des classes abstraites dans Python dans 0 lignes de code?"):
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
Donc, en fait, j'ai deux questions:
- Laquelle des deux approches est plus pythonique? et
- Comment implémenter le premier?