Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

design pattern strategy en python, zope interface

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

2 réponses

Avatar
Bruno Desthuilliers
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()

Avatar
jeanmarc.pouchoulon
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()