SHARE
TWEET

Exemple d'exemple

a guest Feb 12th, 2013 215 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top