Comme expliqué dans l'activité 1, une instance de classe possède des attributs (variables) et des méthodes (fonctions). Commençons par les attributs :

Nous allons associer un attribut vie à notre classe personnage (chaque instance aura un attribut vie, quand la valeur de vie deviendra nulle, le personnage sera mort !)

Ces attributs s'utilisent comme des variables, l'attribut vie pour Bilbo sera noté


bilbo.vie
			

de la même façon l'attribut vie de l'instance Gollum sera noté


gollum.vie
			

À faire vous même 3.1

Saisissez, analysez et testez ce code


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Défini une classe personnage
class personnage(object):
    pass
# on crée une instance de la classe personnage nommée Gollum
gollum=personnage()
# On donne 20 points de vie à Gollum en créant un attribut (variable dans une classe) vie pour #l'instance Gollum
gollum.vie=20
# on créé une autre instance de la classe personnage nommée Bilbo
bilbo=personnage()
# On donne 20 points de vie à Bilbo
bilbo.vie=20
#affichage du nombre de points de vie pour Bilbo
print ('Bilbo a '+str(bilbo.vie)+' points de vie')
#affichage du nombre de points de vie pour Gollum
print ('Gollum a '+str(gollum.vie)+' points de vie')
print ('Bilbo est blessé par Gollum')
#Bilbo est blessé, il perd un point de vie
bilbo.vie=bilbo.vie-1
#on affiche de nouveau les points de vie
print ('Bilbo a '+str(bilbo.vie)+' points de vie')
print ('Gollum a '+str(gollum.vie)+' points de vie')
			

Tout ceci est bien beau, mais pas très « propre », et cette façon de programmer ferait dresser les cheveux sur la tête de n'importe quel programmeur chevronné !

En effet, nous ne respectons pas un principe de base de la POO : l'encapsulation

Il ne faut pas oublier que notre classe doit être « enfermée dans une caisse » pour que l'utilisateur puisse l'utiliser facilement sans se préoccuper de ce qui se passe à l'intérieur, or, ici, ce n'est pas vraiment le cas.

En effet, les attributs (gollum.vie et bilbo.vie), font partie de la classe et devraient donc être enfermés dans la caisse ! Que font-ils en dehors de la définition de la classe alors ?

Pour résoudre ce problème, nous allons définir les attributs, dans la classe, à l'aide d'une méthode (une méthode est une fonction définie dans une classe) d'initialisation des attributs.

Cette méthode est définie dans le code source par la ligne (le mot self est obligatoirement le premier argument, quelque soit la méthode).


def __init__ (self)
			

(le mot self est obligatoirement le premier argument, quelque soit la méthode).

Nous retrouvons ce mot self lors de la définition des attributs (la définition des attributs sera de la forme :


self.vie=20
			

La présence de ce mot self est assez compliquée à expliquer. En gros, 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(object):
 def __init__ (self):
  self.vie=20
#fin de la classe
			

Ensuite lors de la création de l'instance gollum, python va automatiquement remplacer self par gollum et ainsi créer un attribut gollum.vie qui 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 bilbo.vie.

À faire vous même 3.2

Saisissez, analysez et testez ce code


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Défini une classe personnage
class personnage(object):
    # on définit la méthode qui va initialiser les attributs
    def __init__(self):
        self.vie=20
    # fin __init
#fin class
# on crée une instance de la classe personnage nommée Gollum
gollum=personnage()
# on créé une autre instance de la classe personnage nommée Bilbo
bilbo=personnage()
#affichage du nombre de points de vie pour Bilbo
print ('Bilbo a '+str(bilbo.vie)+' points de vie')
#affichage du nombre de points de vie pour Gollum
print ('Gollum a '+str(gollum.vie)+' points de vie')
print ('Bilbo est blessé par Gollum')
#Bilbo est blessé, il perd un point de vie
bilbo.vie=bilbo.vie-1
#on affiche de nouveau les points de vie
print ('Bilbo a '+str(bilbo.vie)+' points de vie')
print ('Gollum a '+str(gollum.vie)+' points de vie')
			

Le résultat de l'exemple 3.2 est évidemment identique au résultat de l'exemple 3.1. Mais cette fois nous n'avons pas défini l'attribut gollum.vie=20 et bilbo.vie=20 en dehors de la classe, nous avons utilisé une méthode __init__.