Attributs privés

DéfinitionAttribut privé

Un attribut privé est un attribut inaccessible en dehors des méthodes de la classe.

Exemple

L'attribut surface permet de mémoriser la surface du cercle. Au départ, cet attribut est initialisé à -1, et dès l'appel de la méthode surface, il est initialisé.

1
"""
2
Exemple de l'utilisation d'un
3
attribut privé 
4
"""
5
import numpy as np
6
7
class Cercle:
8
    """ 
9
    Classe Cercle définie par  son centre et son rayon
10
    """
11
12
    _nb_cercle = 0 # champ static utilisé pour compter le nombre d'objet cercle
13
    def __init__(self, x, y, r=1):
14
        """
15
        définition du cercle à partir
16
        de l'abscisse et de l'ordonnée du centre et
17
        de son rayon
18
         Argument:
19
        x -- abscisse du centre
20
        y -- ordonnée du centre
21
        r -- rayon
22
        """
23
        self.centre = (x, y)
24
        self.rayon = r
25
        Cercle._nb_cercle += 1
26
        self.__surface = -1
27
    def surface(self):
28
        """
29
        Calcul la surface du cercle
30
        return : surface du cercle
31
        """
32
        if self.__surface < 0:
33
            self.__surface = np.pi * self.rayon * self.rayon
34
        return self.__surface
35
36
if __name__ == '__main__':
37
    c1 = Cercle(0, 0)
38
    c2 = Cercle(2, 1, 3)
39
    c3 = Cercle(-1, 1, 3)
40
    print("Nombre d'objets Cercle : ", Cercle._nb_cercle)
41
    print("La surface du Cercle de centre  ",
42
        c2.centre, ' et de rayon ',
43
        c2.rayon, ' est : ', c2.surface())
44

Si la commande suivante print(c3.__surface) est entrée dans python alors le message d'erreur s'affiche :

AttributeError: 'Cercle' object has no attribute '__surface'

ExempleEncapsulation

Dans l'exemple précédent,une modification du rayon a pour conséquence que la valeur de surface devient fausse.

Pour éviter cela, on peut rendre privé l'attribut rayon et le modifier en utilisant une nouvelle méthode

1
"""
2
Exemple de l'utilisation d'une
3
variable static pour compter
4
le nombre d'objets
5
"""
6
import numpy as np
7
8
class Cercle:
9
    """ 
10
    Classe Cercle définie par  son centre et son rayon
11
    """
12
13
    _nb_cercle = 0 # utiliser pour compter le nombre d'objet cercle
14
    def __init__(self, x, y, r=1):
15
        """
16
        définition du cercle à partir
17
        de l'abscisse et de l'ordonnée du centre et
18
        de son rayon
19
         Argument:
20
        x -- abscisse du centre
21
        y -- ordonnée du centre
22
        r -- rayon
23
        """
24
        self.centre = (x, y)
25
        self.__rayon = r
26
        Cercle._nb_cercle += 1
27
        self.__surface = -1
28
    def setRayon(self, r):
29
        if r == None:
30
            return self.__rayon
31
        self.__rayon = r
32
        self.__surface = -1
33
        return self.__rayon
34
    def getRayon(self):
35
         return self.__rayon
36
    def surface(self):
37
        """
38
        Calcul la surface du cercle
39
        return : surface du cercle
40
        """
41
        if self.__surface < 0:
42
            self.__surface = np.pi * self.__rayon * self.__rayon
43
        return self.__surface
44
45
if __name__ == '__main__':
46
    c1 = Cercle(0, 0)
47
    print("La surface du Cercle de centre  ",
48
        c1.centre, ' et de rayon ',
49
        c1.getRayon(), ' est : ', c1.surface())
50
    c1.setRayon(2)
51
    print("La surface du Cercle de centre  ",
52
        c1.centre, ' et de rayon ',
53
        c1.getRayon(), ' est : ', c1.surface())
54
   

Le résultat du programme précédent est :

La surface du Cercle de centre (0, 0) et de rayon 1 est : 3.141592653589793

La surface du Cercle de centre (0, 0) et de rayon 2 est : 12.566370614359172

Les méthodes getRayon et setRayon sont appelées mutateur (Getters and Setters). Ces méthodes permettent d'accéder ou de modifier un attribut privé.