design pattern strategy en python, zope interface
Le
jeanmarc.pouchoulon
Bonjour à tous,
J'essaye de traduire en python les exemples JAVA du livre "design
patterns tête la première" pour le pattern statégie.
Auriez vous des exemples d'implémentation de ce pattern en Python ?
En Java le code source fait apparaitre sur une classe abstraite
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior
Des références à une autre interface
Comment faire ca avec zope interface ?
Extrait de mon code :
import zope.interface
class IComportementVol(zope.interface.Interface):
"""Interface de comportment de vol"""
def voler():
""" méthode voler pour un canard"""
class VolerAvecDesAiles(object):
zope.interface.implements(IComportementVol)
def voler(self):
print "je vole"
class NePasVoler(object):
zope.interface.implements(IComportementVol)
def voler(self):
print "je ne sais pas voler"
class IComportementCancan(zope.interface.Interface):
"""Interface de comportment de cancan"""
def cancaner():
""" methode cancaner pour un canrd """
class Cancan(object):
zope.interface.implements(IComportementCancan)
def cancaner(self):
print "Cancan"
class CancanMuet(object):
zope.interface.implements(IComportementCancan)
def cancaner(self):
print "Silence"
class ACanard(object):
def __init__(self):
raise NotImplementedError
def effectuerVol(self):
IComportementVol.__dict__['_InterfaceClass__attrs']['voler']()
def
effectuerCancan(self):IComportementCancan.__dict__['_InterfaceClass__attrs']['cancaner']()
class Colvert(ACanard):
""" classe des canards col vert """
def __init__(self):
comportementCancan = Cancan()
comportementVol = VolerAvecDesAiles()
def afficher(self):
print "je suis un vrai Colvert"
colvert = Colvert()
colvert.effectuerCancan()
colvert.effectuerVol()
J'essaye de traduire en python les exemples JAVA du livre "design
patterns tête la première" pour le pattern statégie.
Auriez vous des exemples d'implémentation de ce pattern en Python ?
En Java le code source fait apparaitre sur une classe abstraite
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior
Des références à une autre interface
Comment faire ca avec zope interface ?
Extrait de mon code :
import zope.interface
class IComportementVol(zope.interface.Interface):
"""Interface de comportment de vol"""
def voler():
""" méthode voler pour un canard"""
class VolerAvecDesAiles(object):
zope.interface.implements(IComportementVol)
def voler(self):
print "je vole"
class NePasVoler(object):
zope.interface.implements(IComportementVol)
def voler(self):
print "je ne sais pas voler"
class IComportementCancan(zope.interface.Interface):
"""Interface de comportment de cancan"""
def cancaner():
""" methode cancaner pour un canrd """
class Cancan(object):
zope.interface.implements(IComportementCancan)
def cancaner(self):
print "Cancan"
class CancanMuet(object):
zope.interface.implements(IComportementCancan)
def cancaner(self):
print "Silence"
class ACanard(object):
def __init__(self):
raise NotImplementedError
def effectuerVol(self):
IComportementVol.__dict__['_InterfaceClass__attrs']['voler']()
def
effectuerCancan(self):IComportementCancan.__dict__['_InterfaceClass__attrs']['cancaner']()
class Colvert(ACanard):
""" classe des canards col vert """
def __init__(self):
comportementCancan = Cancan()
comportementVol = VolerAvecDesAiles()
def afficher(self):
print "je suis un vrai Colvert"
colvert = Colvert()
colvert.effectuerCancan()
colvert.effectuerVol()

Poser une question


Il y en a un (un peu javaesque AMHA) dans Thinking in Python de Bruce
Eckel (librement disponible en ligne sur le site de l'auteur)
Inutile. Puisqu'on est dans les canards, autant utiliser le typage éponyme:
class Comportement(object):
def __init__(self, objWithName):
assert hasattr(objWithName, 'name')
self._obj = objWithName
def __call__(self, *args, **kwargs):
print "comportement indéfini pour %s" % self._obj.name
class VoleCommeUnCanard(Comportement):
def __call__(self, *args, **kwargs):
print "%s vole comme un canard" % self._obj.name
class NeVolePas(Comportement):
def __call__(self, *args, **kwargs):
print "%s ne vole pas" % self._obj.name
class CancanneCommeUnCanard(Comportement):
def __call__(self, *args, **kwargs):
print "%s fait coin coin" % self._obj.name
class NeCancannePas(Comportement):
def __call__(self, *args, **kwargs):
print "%s est muet" % self._obj.name
class Canard(object):
def __init__(self, name, voler=None, cancanner=None):
self.name = name
self.vole = voler is not None and voler(self)
or Comportement(self)
self.cancanne = cancanner is not None and cancanner(self)
or Comportement(self)
def coincoin():
daffy = Canard('daffy', VoleCommeUnCanard, CancanneCommeUnCanard)
donald = Canard('donald')
print "daffy : "
daffy.vole()
daffy.cancanne()
print "donald :"
donald.vole()
donald.cancanne()
print "soignons ce pauvre donald:"
donald.vole = NeVolePas(donald)
donald.cancanne = NeCancannePas(donald)
donald.vole()
donald.cancanne()
print "Mmm... pas au point. Essayons encore :"
donald.vole = VoleCommeUnCanard(donald)
donald.cancanne = CancanneCommeUnCanard(donald)
donald.vole()
donald.cancanne()
print "hebinvoila ! coincoincoin !-)"
if __name__ == '__main__':
coincoin()
saturnin