T2.1 Programmation orientée objet

Créer une classe pas à pas

créer une Classe

Un exemple pas à pas

Nous allons commencer par écrire une classe Personnage (qui sera dans un premier temps une coquille vide) et, à partir de cette classe créer 2 instances : bilbo et gollum.

Exemple : création d'une classe

Exécutez ce code. Observez le type des variables gollum et bilbo

Les classe (ou objets) sont des types personnalisés


Pour l'instant, notre classe ne sert à rien et nos instances d'objet ne peuvent rien faire. Comme il n'est pas possible de créer une classe totalement vide, nous avons utilisé l'instruction pass qui ne fait rien. Ensuite nous avons créé 2 instances de la classe Personnage : gollum et bilbo.

Le constructeur : la méthode __init__

La méthode __init__

Les attributs de l'objet doivent être définis dans la classe, à l'aide d'une méthode d'initialisation des attributs.

Une méthode particulière, nommée LE CONSTRUCTEUR, permet de définir les attribut dès l'instanciation d'un objet.

Cette méthode est définie dans le code source par la ligne :

def __init__ (self) :
Rappel : La méthode __init__ est automatiquement exécutée au moment de la création d'une instance. Le mot self est obligatoirement le premier argument d'une méthode.

Le mot self représente l'instance. Quand vous définissez une instance de classe (bilbo ou gollum) le nom de votre instance va remplacer le mot self.

Dans le code source, nous allons avoir :

class Personnage:
def __init__ (self):
    self.vie = 20
Ensuite lors de la création de l'instance gollum, python va créer un attribut vie de la variable gollum.

Cet attribut aura aura pour valeur de départ la valeur donnée à self.vie dans la méthode __init__

Il se passera exactement la même chose au moment de la création de l'instance bilbo, on aura automatiquement la création de l'attribut vie de la variable bilbo.

Exécutez ce code, et dans la console, faites afficher les valeurs de gollum.vie et bilbo.vie

Exercice de code : Encapsuler les attributs
Ajoutez les instruction pour afficher les vies de Bilbo puis de Gollum.

Imaginons que nos 2 personnages n'aient pas au départ les mêmes points de vie ! Pour l'instant, impossible d'introduire cette contrainte (self.vie = 20)

Une méthode, comme une fonction, peut prendre des paramètres (des arguments).

Le passage de paramètres se fait au moment de la création de l'instance. Modifiez le code pour que le nombre de vies soit un paramètre dont la valeur sera fixée lors de l'instanciation.

Exercice de code : Passer des arguments aux méthodes
Votre code doit :
  • Permettre de passer un argument nbVies
  • Crée une instance Personnage nommée bilbo initialisée avec 20 vies.
  • Créer une autre instance, gollum, avec 15 vies.
  • Afficher les valeurs de l'attribut vie pour bilbo
  • Afficher les valeurs de l'attribut vie pour gollum

Au moment de la création de l'instance gollum, on passe comme argument le nombre de vies (gollum = Personnage (15)).

Nous pouvons passer plusieurs arguments à la méthode __init__ (comme pour n'importe quelle fonction).

Exercice de code : Passer 2 arguments
Votre code doit :
  • Permettre de passez deux paramètres au constructeur.
  • Utiliser les paramètres pour initialiser les attibuts vie et age.
  • Créer une instance, gollum, avec 20 vies et 127 ans.
  • Afficher ceci (en utilisant les attributs) : gollum a 127 ans et 20 vies

Améliorons en ajoutant d'autres méthodes

utiliser une classe avec plusieurs méthodes
Exercice de code : plus de méthodes...
Votre code doit :
  • Ajouter une méthode perdVie qui modifie l'attibut vie (retire une vie)
  • Ajouter une méthode donneEtat qui renvoie la valeur de l'attibut vie
  • Créez 1 seul personnage, gollum, avec 20 vies. puis vous définirez
  • créer 1 variable etat1 égale à son nombre de vie.
  • Modifier le nombre de vie avec la méthode perdVie
  • créer 1 variable etat2 égale à son nombre de vie.

Vous avez sans doute remarqué que lors de "l'utilisation" des instances bilbo et gollum, nous avons uniquement utilisé des méthodes et nous n'avons plus directement utilisé des attributs (plus de "gollum.vie"). Il est important de savoir qu'en dehors de la classe l'utilisation des attributs est une mauvaise pratique en programmation orientée objet : les attributs doivent rester "à l'intérieur" de la classe, l'utilisateur de la classe ne doit pas les utiliser directement. Il peut les manipuler, mais uniquement par l'intermédiaire d'une méthode (la méthode self.perdVie() permet de manipuler l'attribut self.vie)

Ajouter une méthode puis utliser la classe
Exercice de code
Nos personnages peuvent boire une potion qui leur ajoute un point de vie. Vous devez :
  • Modifiez la classe Personnage en ajoutant une méthode boirePotion.
  • créer une fonction simul(n) qui crée un personnage avec n vies, lui fait boire une potion, et renvoi le nombre de vie.
Passer des arguments à une méthode

Passer des arguments à nos méthodes

Selon le type d'attaque subit, le personnage peut perdre plus ou moins de points de vie. Pour tenir compte de cet élément, ajoutez un paramètre à la méthode perdVie.

Exercice de code
Vous devez :
  • Modifier la méthode perdVie pour que le nombre de vies perdues soit un paramètre.
  • instancier gollum avec 15 vies
  • Lui faire perdre 2 vies avec la méthode perdVie
  • Faire afficher le nombre de vies avec la méthode donneEtat
CONTRAINTE : vous ne pouvez pas utiliser la notation pointée gollum.vie
De l'impératif dans les méthodes

Il est bien entendu possible d'utiliser la librairie random pour ajouter une part d'aléatoire dans la méthode perdVie.

Exercice de code : Un peu de hasard ne nuira pas...
Modifiez le code précédent, de façon que perdVie(nbreDeVie) retire entre 1 et un paramère nbreDeVie vies au personnage attaqué. Vous devez :
  1. Modifier la class Personnage
  2. Completer le code de façon à créer un personnage ayant 100 vies puis qui subit 3 attaques consécutives, lui infligeant chacune 1 à 10 vies perdues...

Dans une méthode vous pouvez utiliser toutes les instructions que vous connaissez déjà en paradigme impératif. Modifiez de nouveau le code, cette fois la méthode perdVie doit être écrite de façon à ne jamais renvoyer un nombre de vie négatif. Si le nombre de vie est négatif, nombre de vie sera mis à 0.

Exercice de code : plus mort que mort ?
Modifiez de nouveau le code, cette fois la méthode perdVie doit être écrite de façon à ne jamais renvoyer un nombre de vie négatif. Si le nombre de vie est négatif, nombre de vie sera mis à 0.. Vous devez :
  1. Modifier la class Personnage
  2. Completer le code de façon à créer un personnage ayant 100 vies puis qui subit des attaques consécutives, lui infligeant chacune 1 à 10 vies perdues, jusqu'à ce qu'il n'ai plus aucune vie. Le code affichera le nombre d'attaques subies.