GNT sans publicité, site mobile, fonctionnalitées exclusives...

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()
Lire les 2 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Desthuilliers
Le #480475
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 ?


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)

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 ?


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()

jeanmarc.pouchoulon
Le #480245
Super je regarde ca Merci

saturnin


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 ?



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)

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 ?



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()



Publicité
Suivre les réponses
Poster une réponse
Anonyme