Guest User

Exemple d'exemple

a guest
Feb 12th, 2013
244
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. #===============================================
  5. # J’ai plusieurs mamans
  6. #===============================================
  7. class Arme(object):
  8.  
  9.     def __init__(self, nom, degat):
  10.  
  11.         self.nom = nom
  12.         self.degat = degat
  13.  
  14.     def attaque(self, cible): # on retire les degâts de l'épee des points de vie
  15.         cible.vie -= self.degat
  16.  
  17.  
  18. class Protection(object):
  19.  
  20.     def __init__(self, nom, armure):
  21.  
  22.         self.nom = nom
  23.         self.armure = armure
  24.  
  25.     def defend(self, degat): # on diminue les degâts, voire on les annule
  26.  
  27.         degat = degat - self.armure
  28.         if degat < 0:
  29.             return 0
  30.  
  31.         return degat
  32.  
  33.  
  34. epee = Arme('Epée Mana', degat=999)
  35. casque = Protection('Casque de Balduran', armure=1)
  36.  
  37.  
  38. class ProtectionOffensive(Arme, Protection):
  39.  
  40.     def __init__(self, nom, degat, armure):
  41.  
  42.         Arme.__init__(self, nom, degat) # appelle le __init__ de arme
  43.         Protection.__init__(self, nom, armure) # appelle le __init de protection
  44.  
  45.         # comme on a appelé les deux __init__, on va avoir les attributs
  46.         # settés dans les deux __init__ attachés à cette classe
  47.  
  48.  
  49. bouclier = ProtectionOffensive('Bouclier du dragon', degat=10, armure=100)
  50. print bouclier.degat  # 10
  51. print bouclier.armure  # 10
  52. print bouclier.defend(10)  # 0
  53.  
  54.  
  55. #===========================================
  56. # La composition (POO pour les vrais mecs)
  57. #===========================================
  58. class HeroViril(object):
  59.  
  60.     # def __init__(self, nom, prenom, groupe_sanguin, signe_astrologique,
  61.     #              couleur_preferee, tendance_sexuelle, culte,
  62.     #              taille_de_la_troisieme_phallange_de_l_index_gauche)
  63.     # TODO : voir le CDC avec le client pour confirmer les attributs du personnage
  64.     def __init__(self, nom, vie, arme=None):
  65.  
  66.         self.nom = nom
  67.         self.vie = vie
  68.         self.arme = arme
  69.  
  70.     def combattre(self, ennemi):
  71.  
  72.         print "{} attaque {}".format(self.nom, ennemi.nom)
  73.  
  74.         while True:
  75.  
  76.             if self.arme:
  77.                 self.arme.attaque(ennemi)
  78.  
  79.             if ennemi.vie <= 0:
  80.                 break
  81.  
  82.             if ennemi.arme:
  83.                 ennemi.arme.attaque(self)
  84.  
  85.             if self.vie <= 0:
  86.                 break
  87.  
  88.         if self.vie > 0:
  89.             print "Victoire de {}".format(self.nom)
  90.         else:
  91.             print "{} est mort comme une pov' merde".format(self.nom)
  92.  
  93.  
  94. # le code de l'armure ne change pas
  95. class Protection(object):
  96.  
  97.     def __init__(self, nom, armure):
  98.  
  99.         self.nom = nom
  100.         self.armure = armure
  101.  
  102.     def defend(self, degat):
  103.  
  104.         degat = degat - self.armure
  105.         if degat < 0:
  106.             return 0
  107.  
  108.         return degat
  109.  
  110.  
  111. # on change le code de l'arme, si la cible a une protection
  112. # cela diminue les degâts pris
  113. class Arme(object):
  114.  
  115.     def __init__(self, nom, degat):
  116.  
  117.         self.nom = nom
  118.         self.degat = degat
  119.  
  120.     def attaque(self, cible):
  121.  
  122.         # je mets aussi quelques prints pour le lulz
  123.         if cible.protection:
  124.             degat = cible.protection.defend(self.degat)
  125.             print "{} - {} = {}".format(cible.vie, degat, cible.vie - degat)
  126.             cible.vie -= degat
  127.         else:
  128.             print "{} - {} = {}".format(cible.vie, self.degat, cible.vie - self.degat)
  129.             cible.vie -= self.degat
  130.  
  131.  
  132. gosu = HeroViril("Drizzt Do'Urden", 2000)
  133. gosu.arme = Arme('Lame Vorpale', 10)
  134. gosu.protection = Protection("Maille en Kevlar de mithril doré a l'adamantium", 10)
  135. noob_qui_repop = HeroViril("Bob", 200)
  136. noob_qui_repop.arme = Arme('Cure-dent', 1)
  137. noob_qui_repop.protection = Protection("Slip", 1)
  138. noob_qui_repop.combattre(gosu)  # yaaaaaaaaaaaaaaaaaaaaaaa !
  139. #Bob attaque Drizzt Do'Urden
  140. #2000 - 0 = 2000
  141. #200 - 9 = 191
  142. #2000 - 0 = 2000
  143. #191 - 9 = 182
  144. #2000 - 0 = 2000
  145. #182 - 9 = 173
  146. #2000 - 0 = 2000
  147. #173 - 9 = 164
  148. #2000 - 0 = 2000
  149. #164 - 9 = 155
  150. #2000 - 0 = 2000
  151. #155 - 9 = 146
  152. #2000 - 0 = 2000
  153. #146 - 9 = 137
  154. #2000 - 0 = 2000
  155. #137 - 9 = 128
  156. #2000 - 0 = 2000
  157. #128 - 9 = 119
  158. #2000 - 0 = 2000
  159. #119 - 9 = 110
  160. #2000 - 0 = 2000
  161. #110 - 9 = 101
  162. #2000 - 0 = 2000
  163. #101 - 9 = 92
  164. #2000 - 0 = 2000
  165. #92 - 9 = 83
  166. #2000 - 0 = 2000
  167. #83 - 9 = 74
  168. #2000 - 0 = 2000
  169. #74 - 9 = 65
  170. #2000 - 0 = 2000
  171. #65 - 9 = 56
  172. #2000 - 0 = 2000
  173. #56 - 9 = 47
  174. #2000 - 0 = 2000
  175. #47 - 9 = 38
  176. #2000 - 0 = 2000
  177. #38 - 9 = 29
  178. #2000 - 0 = 2000
  179. #29 - 9 = 20
  180. #2000 - 0 = 2000
  181. #20 - 9 = 11
  182. #2000 - 0 = 2000
  183. #11 - 9 = 2
  184. #2000 - 0 = 2000
  185. #2 - 9 = -7
  186. #Bob est mort comme une pov' merde
  187.  
  188.  
  189. #=====================================================================
  190. # Ok, j’ai pigé le principe, mais comment ça marche dans le détail ?
  191. #=====================================================================
  192. class HeroViril(object):
  193.  
  194.     def __init__(self, nom, vie, arme=None):
  195.  
  196.         self.nom = nom
  197.         self.vie = vie
  198.         self.arme = arme
  199.  
  200.     # elle attend un ennemi en paramètre, donc UN OBJET HeroViril
  201.     # self est l'objet en cours, donc aussi un objet HeroViril
  202.     def combattre(self, ennemi):
  203.  
  204.         print "{} attaque {}".format(self.nom, ennemi.nom)
  205.  
  206.         # une petite boucle infinie. Warning, c'est un tuto. Ne faites pas
  207.         # ça chez vous les enfants.
  208.         # cette boucle loop pour toujours si il n'y a pas d'attribut arme donc
  209.         # ceci n'est qu'un exemple. Hein ? Noté ? Les deux du fond là ?
  210.         while True:
  211.  
  212.             # on donne le premier coup à la personne qui attaque (l'objet en
  213.             # cours). On vérifie qu'il a une arme. Si c'est le cas,
  214.             # on appelle la méthode de l'arme "attaque()", et on lui passe
  215.             # en paramètre l'ennemi.
  216.             if self.arme:
  217.                 self.arme.attaque(ennemi)
  218.  
  219.             # condition de sortie de la boucle sur la vie du héros qui a pris
  220.             # le coup
  221.             if ennemi.vie <= 0:
  222.                 break
  223.  
  224.             # ensuite on fait pareil à l'envers pour donner une chance à l'autre
  225.             # de répliquer : on vérifie que l'ennemi a une arme, et si c'est
  226.             # le cas, on applique la méthode "attaque" de l'arme à l'objet
  227.             # en cours
  228.             if ennemi.arme:
  229.                 ennemi.arme.attaque(self)
  230.  
  231.             # condition de sortie de la boucle sur la vie du héros qui a pris
  232.             # le coup
  233.             if self.vie <= 0:
  234.                 break
  235.  
  236.         # une fois sorti de la boucle, on vérifie le niveau de vie pour
  237.         # désigner le vainqueur
  238.         if self.vie > 0:
  239.             print "Victoire de {}".format(self.nom)
  240.         else:
  241.             print "{} est mort comme une pov' merde".format(self.nom)
  242.  
  243.  
  244. class Arme(object):
  245.  
  246.     def __init__(self, nom, degat):
  247.  
  248.         self.nom = nom
  249.         self.degat = degat
  250.  
  251.     # self est l'objet en cours, donc l'arme
  252.     # cible est un héros, puisqu'on l'a passé en paramètre
  253.     def attaque(self, cible):
  254.  
  255.         # si la cible (l'objet héros) a un attribut protection,
  256.         # les dégâts retirés sont diminués (ce calcul est fait par la protection)
  257.         if cible.protection:
  258.             cible.vie -= cible.protection.defend(self.degat)
  259.  
  260.         # sinon, on retire les dégâts à la vie de la cible (le héros)
  261.         # directement
  262.         else:
  263.             cible.vie -= self.degat
  264.  
  265.  
  266. class Protection(object):
  267.  
  268.     def __init__(self, nom, armure):
  269.  
  270.         self.nom = nom
  271.         self.armure = armure
  272.  
  273.     # self est l'objet en cours, donc la protection
  274.     # degat est un simple int
  275.     def defend(self, degat):
  276.         # on retourne les degâts infligés, moins la protection
  277.         return degat - self.armure
  278.  
  279.  
  280. class ArmeMegaEmpoisonnee(Arme):
  281.  
  282.     def __init__(self, nom, degat, poison=100000):
  283.         super(ArmeMegaEmpoisonnee, self).__init__(nom, degat)
  284.         self.poison = poison
  285.  
  286.  
  287.     def attaque(self, cible):
  288.  
  289.         # on prend les degâts une premiere fois
  290.         super(ArmeMegaEmpoisonnee, self).attaque(cible)
  291.  
  292.         # puis on prend les dégâts du poison
  293.         cible.vie -= self.poison
  294.  
  295.  
  296. noob_qui_repop.vie = 200 # rePOP !
  297. noob_qui_repop.arme = ArmeMegaEmpoisonnee('Cheat Code', 1)
  298. noob_qui_repop.combattre(gosu) # Vengeance !
  299. #Bob attaque Drizzt Do'Urden
  300. #2000 - 0 = 2000
  301. #Victoire de Bob
  302.  
  303.  
  304. #=============================================
  305. # Choisir entre l’héritage et la composition
  306. #=============================================
  307.  
  308.  
  309. #=============================================
  310. # Le design pattern “stratégie”
  311. #=============================================
  312. import os
  313.  
  314. class ParseurXml(object):
  315.     # ...
  316.     pass
  317.  
  318. class ParseurJson(object):
  319.     # ...
  320.     pass
  321.  
  322.  
  323. class ParseurDeFichier(object):
  324.  
  325.     _strategy = { # les stratégie par défaut
  326.         'json': ParseurXml,
  327.         'xml': ParseurJson
  328.     }
  329.  
  330.     def __ini__(self, fichier, strategy=None):
  331.  
  332.         self.fichier = fichier
  333.         # on récupère l'extension du fichier
  334.         path, ext = os.path.splitext(fichier)
  335.  
  336.         # Strategy est une classe de parseur
  337.         # on la récupère depuis les paramètres ou selon
  338.         # l'extension
  339.         Strategy = strategy or self._strategy[ext]
  340.         # on instancie notre classe de strategie
  341.         self.strategy = Strategy(fichier)
  342.  
  343.     def parse(self):
  344.         # on délègue le boulot à la stratégie
  345.         self.strategy.parse()
RAW Paste Data