Bon, alors un jours va vraiment falloir que python soit claire sur ça définition des classes et des variables parce que c'est quand même un sacré bordel.... Aller, ça fait un moment que j'ai pas divaguer sur de la prog ici, c'est parti pour un cours de classe en python ... ^^ <p style="text-align:left;"><span>Alors du coup, petit rappel. Python est un langage de programmation initialement centré sur le </span><em><span>scripting</span></em><span> (faire une série de fonctions qui vont s'exécuter à la suite l'un de l'autre dans un seul fichier et que l'on peut exécuter directement). Il est depuis devenu un langage de programmation avec entre autres des brides de programmation objet via la création de </span><em><span>Classe</span></em><span>.</span></p><p style="text-align:left;"><strong><span>Mais qu'est ce qu'une classe du coup ?</span></strong></p><p style="text-align:left;"><span>Une classe, c'est un plan de construction pour définir des objets. Par exemple, dans un jeu vidéo, un personnage va souvent être représenté par une classe<br /> </span><em><span>Personnage </span></em><span>qui contient tous les attributs des personnages (</span><em><span>vie, vitesse, armure, etc...)</span></em><span>. Ainsi je pourrais créer différents personnage rapidement, par exemple: </span><em><span>Thomas(100, 250, 1000, ...), Switchelven(50, 300, 300), MamanFreg(150, 150, 800....)....<br /><br /> </span></em><span>Les attributs peuvent être définis de plusieurs manière:<br /></span><em><span>public</span></em><span> (utilisable && visible partout dans le code), </span><em><span>privée</span></em><span> (utilisable && visible uniquement dans la classe) (certains langage ont d'autre variante comme </span><em><span>protected </span></em><span>en JAVA mais on ne va pas rentrer dans les détails ^^), d'</span><em><span>instance</span></em><span> (définie comme existante pour tout représentant de la classe mais propre à chaque représentant), ou de </span><em><span>classe</span></em><span> (définie comme existante et partagée par tout représentant).<br /><br /> En python, la notion de variable </span><em><span>publique</span></em><span> ou </span><em><span>privée </span></em><span>est assez claire depuis quelque version pars l'utilisation du préfix </span><code>__</code><span> (la variable </span><code>toto</code><span> est public mais </span><code>__titi</code><span> est privée). Par contre, la différence entre une variable de classe et une variable d'instance est plutôt floue....<br /><br /> Reprenons nos personnages. Une définition en python de la classe personnage serait:<br /><br /></span></p><p style="text-align:left;"><span>class Personnage:</span></p><p style="text-align:left;"><span> life: int</span></p><p style="text-align:left;"><span> speed: int</span></p><p style="text-align:left;"><span> armor: int</span></p><p style="text-align:left;"><span> def __init__(self, life: int, speed: int, armor: int):</span></p><p style="text-align:left;"><span> self.life = life</span></p><p style="text-align:left;"><span> self.speed = speed</span></p><p style="text-align:left;"><span> self.armor = armor</span></p><p style="text-align:left;"><span> </span></p><p style="text-align:left;"><span>Ici, toutes les variables sont des variables d'instances. Selon la documentation de python, une variable est propre à l'instance lorsqu'elle est définie dans la méthode d'`__init__` permettant d'instancier la classe. Si elle n'est présente que dans le corps de la classe, elle devient une variable de classe.<br /><br />Par exemple, ajoutons à nos personnage une vie maximum, une occupation, et une liste de ville existante:</span></p><p style="text-align:left;"><span>class Personnage:</span></p><p style="text-align:left;"><span> life: int</span></p><p style="text-align:left;"><span> speed: int</span></p><p style="text-align:left;"><span> armor: int</span></p><p style="text-align:left;"><span>max_life: int = 100</span></p><p style="text-align:left;"><span>occupation: str = 'qwicer'</span></p><p style="text-align:left;"><span>cities: List[str] = ['paris', 'cayeux', 'quebec', 'rouen']</span></p><p style="text-align:left;"><span> def __init__(self, life: int, speed: int, armor: int):</span></p><p style="text-align:left;"><span> self.life = life</span></p><p style="text-align:left;"><span> self.speed = speed</span></p><p style="text-align:left;"><span> self.armor = armor</span></p><p style="text-align:left;"><span>Celles-ci sont désormais des variables reliées et attendues communes à tous les personnages. </span></p><p style="text-align:left;"><span>Et c’est là que commence la magie noire de python. En générale, nous nous attendons au comportement suivant:</span></p><ul><li><p style="text-align:left;"><span>Si je modifie la valeur d’une variable d’instance, alors la modification n’est visible que dans l’instance en question</span></p></li></ul><ul><li><p style="text-align:left;"><span>Si je modifie la valeur d’une variable de classe, alors la modification est partagée par toutes les instances de la classe</span></p></li></ul><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span>Autrement dit, si je crée les méthodes suivantes pour ma classe personnage:</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span> def take_damage(self, attack: int):</span></p><p style="text-align:left;"><span> self.life -= max(attack/(self.armor/10),1)</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span> def set_max_life(self, new_value: int):</span></p><p style="text-align:left;"><span> self.max_life = new_value</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span> def add_city(self, new_city: str):</span></p><p style="text-align:left;"><span> self.cities.append(new_city)</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span>Et que je les appliques à nos personnages:</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><code>thomas.take_damage(10)</code><span> -> thomas doit perdre un point de vie, donc se retrouve à 99</span></p><p style="text-align:left;"><code>switchelven.take_damage(60)</code><span> -> switchelven doit perdre 2 PV, donc se retrouve à 48</span></p><p style="text-align:left;"><code>maman_freg.add_city(‘Hanoï’)</code><span> -> tout le monde connaît desormais Hanoï</span></p><p style="text-align:left;"><span>thomas = Personnage(100,250,1000)</span></p><p style="text-align:left;"><span>switchelven = Personnage(50,300,300)</span></p><p style="text-align:left;"><span>maman_freg = Personnage(150,150,800)</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span>thomas.take_damage(10)</span></p><p style="text-align:left;"><span>print("Thomas' life: ", thomas.life)</span></p><p style="text-align:left;"><span>print("Switchelven's life: ", switchelven.life)</span></p><p style="text-align:left;"><span><br /></span></p><p style="text-align:left;"><span>switchelven.take_damage(60)</s