classe

Anglais : class

  • Concepts liés :

1er niveau : attribut, attribut de classe, attribut d'instance, méthode (fonction définie dans une classe), surcharge, constructeur (fonction de nom _init_), création - instanciation, portée

2ème niveau : héritage, héritage simple, héritage multiple, redéfinition, conflit d'héritage

La syntaxe

class ClassName:

<statement 1>

...

<statement N>

La notion de classe, d'attributs, de méthodes et de constructeurs

En programmation objet, une classe déclare (définit) des propriétés communes à un ensemble d'objets (les instances de la classe). C'est un "moule" à partir duquel on crée des objets.

Une classe est en quelque sorte une autre forme de types.

Que contient une déclaration de classes?

Elle contient :

  • des déclaration de données - variables (en programmation objet, on les appelle des attributs) ; il s'agit ici d'attributs de classe par opposition au concept d'attributs d'instance ;
  • et des déclaration de fonctions (en programmation objet, on les appelle des méthodes).

La syntaxe dit simplement qu'une classe (En Python, on parle d'objet classe), c'est un nom (Compte-chèque dans l'exemple ci-dessous) et est une suite d'instructions. Notez que le nom d'une classe commence par une majuscule. Ce n'est pas obligatoire ; mais cela permet de les distinguer des noms d'instances et autres objets.

class Exemple :

# une classe vide

pass


Syntaxe
Un exemple en Java
Le même exemple en Python

class ClassName :

statement-1

. . .

class CompteCheque ;

// constructeurs

public CompteCheque ()
{sommeEnDepot = 0 }

public CompteCheque (int sommeInitiale)
{sommeEnDepot = sommeInitiale}

// services qui modifient

public void deposerRetirer (int uneSomme)
{ sommeEnDepot += uneSomme }


public void setSommeMinimale (int uneSomme)
{sommeMinimale = uneSomme }

// services de consultation (accesseurs)

public int getSommeDisponible ()
{return sommeEnDepot }

public int getSommeMinimale ()
{return sommeMinimale }

// états par les attributs ou donnée de l'objet

private int sommeEnDepot ;

private int sommeMinimale ;

// attributs et méthodes d'instances

static public int sommeTotaleDeposee ;

static int getSommeTotaleDeposee ()
{return sommeTotaleDeposee}

class CompteCheque :

// constructeurs

def __init__(self)

self.sommeEnDepot = 0

def __init__(self, sommeInitiale)

self.sommeEnDepot = sommeInitiale

// services qui modifient

def deposerRetirer (self, uneSomme)

self.sommeEnDepot += uneSomme

def retirer (self, uneSomme)

pass

def setSommeMinimale (self, uneSomme)

pass

// services de consultation (accesseurs)

def getSommeDisponible ()

pass

def getSommeMinimale (self)

pass

// états par les attributs ou donnée de l'objet

# pas besoin de déclarer l'attribut d'instance somme_en_depot

# il apparait dans la fonction _init_


Constructeur. Fonction init.

Des méthodes particulières, les constructeurs, permettent de construire les objets, instances de la classe. Les constructeurs ont un nom particulier __init__ en python (notez que init est entouré des deux côtés par deux caractères soulignés). Notez aussi que _init_ apparait 2 fois, une fois sans paramètres (le compte est initialisée à 0) et une fois avec un paramètre. Il y a surcharge (overloading de la fonction _init_). 2 fonctions avec le même nom. L’ambiguïté est levée à l'appel de la fonction.

Attribut d'instance. Pas la peine de les déclarer

Un attribut d'instance existe en autant d'exemplaires qu'il y a d'instances créés d'une même classe. Le seul fait d'écrire self.sommeEnDepot = 0 dans la première fonction _init_ introduit (déclare) un attribut d'instance. Notez la notation pointée. Il ne faut pas oublier self., car il se pourrait que dans une autre portée (classe, ...) existe un autre sommeEnDepot

Attribut de classe. Fonction de classe.

Un attribut de classe est déclaré au niveau de la classe. On peut aussi déclarer des fonctions

class CompteCheque :

ComptesCrees = 0 # attributs de classe

SommeTotaleEnDepot = 0

def montantMoyenDUnDepot () # fonction de classe

return SommeTotaleEnDepot/ComptesCrees

...

def deposerRetirer (self, uneSomme)

self.sommeEnDepot += uneSomme

sommeTotaleEnDepot += uneSomme

On accède directement de l'intérieur de la classe, sans notation pointée, aux attributs de la classe.
De l'extérieur de la classe, on utilise la notation pointée.

print (CompteCheque.Comptes crees)
print (CompteCheque.SommeTotaleEndepot)
print (CompteCheque.montantMoyenDUnDepot());

Classes et héritage.

L'héritage simple d'abord. Et la notion de redéfinition.

Les classes peuvent être reliées par un lien d'héritage qui traduit une relation "est un" entre les objets, ainsi qu'une hiérarchie du plus abstrait au plus concret, du plus général au plus spécialisé.

Un humain est un mammifère. Et un mammifère est un animal. Un animal est un être vivant.

class etreVivant :

# attributs des êtres vivants

class animal (etreVivant) : # animal est est une sous-classe de etre Vivant. etreVivant est une sur-classe de animal

# attributs spécifiques aux instances de animal. Certains attributs de animal peuvent être redéfinis à ce niveau (cf redéfinition)

class mammifere (animal)

# attributs spécifiques aux instances de mammifere

class humain (mammifere)

# attributs spécifiques aux instances de mammifere

Nous avons ci-dessus des cas d'héritage simple. Une classe hérite d'une seule classe et pas de plusieurs.

Il est possible de créer :
  • une instance de animal a = animal ()
  • une instance de humain h = humain ()
  • etc,

Puis d'accéder aux attributs de ces objets, par la notation pointée habituelle :

a.ageEstimee ()

h.ageEstimee ()

Pour chaque classe, un fonction ageEstimee est fournie avec différents algorithmes (redéfinition). Un humain est un animal, mais quand on sait aiguiller vers le bon algorithme.

Python se sert de l'identité de l'objet.

a=h

a.ageEstimee () # on a toujours à faire à un humain

Héritage mutiple

Un doctorant est membre du personnel. Il est aussi élève. Et les membres du personnel et les élèves sont des humains.

class membreDuPersonnel (humain)

# attributs nouveaux et redéfinitions d'attributs

class eleve (humain)

# attributs nouveaux et redéfinitions d'attributs

class doctorant (membreDuPersonnel, eleve)

# attributs nouveaux et redéfinitions d'attributs

doctorant est à la fois une sous-classe directe des classes membreDuPersonnel et eleve. Il y a héritage multiple.

Attention, un conflit peut apparaitre si un attribut n'est pas défini dans une classe (doctorant), mais dans chacune des classes mères (membreDuPersonnel et eleve). Et bien Python s'évite les complications. Il regarde d'abord si l'attribut est dans membre du Personnel, puis s'il n'est pas dans eleve, puis s'il n'est pas dans humain, puis ... Il ya un ordre de résolution de conflit d'héritage.

Dans le cas général. Profondeur d'abord, puis de gauche à droite. For most purposes, in the simplest cases, you can think of the search for attributes inherited from a parent class as depth-first, left-to-right, not searching twice in the same class where there is an overlap in the hierarchy. Thus, if an attribute is not found in DerivedClassName, it is searched for in Base1, then (recursively) in the base classes of Base1, and if it was not found there, it was searched for in Base2, and so on.

Remarque 1

Une exception est une classe

Remarque 2 pour ceux qui connaissent Java, C++, ...

Pas de notions en python de classe abstraite. Toutes les classes sont concrètes, à savoir complètes. elles sont instanviables)

Remarque 3 pour ceux qui connaissent Java, C++, ...

Pas de notion de public, private et protected. Tous les attributs d'une classe sont publics (utilisables via la notation pointée).



» Glossaire du langage python