Programmation objet en Python : classes, héritage…

Vous trouverez sur cette page une introduction à la programmation objet en Python. Python est un langage orienté objet, permettant la définition de classes.

Orienté objet : ça veut dire quoi ?

Le fait qu'un langage soit « orienté objet » ou « totalement orienté objet » est une caractéristique assez générale, qu'il faut expliciter un minimum pour en comprendre les tenants et les aboutissants.

Globalement, les langage de programmation objet implémentent le paradigme de programmation orientée objet (POO). Ce paradigme consiste en la réunion des données et des traitements associées à ces données au sein d’entités cohérentes appelées objets.

Langages à classes ou à prototypes

Là où les choses se compliquent, c'est que tous les langages objets ne permettent pas de créer et manipuler des classes (représentation d’un « moule » permettant de créer des objets instances, et regroupant les attributs et méthodes communes à ces objets), contrairement à ce que beaucoup pensent.

En effet, il existe deux types de langages objet :

  • Les langages objets à classes
  • Les langages objets à prototypes

Les langages objets à prototypes (comme par exemple Javascript) ne permettent pas nativement de créer des classes, même s'il manipulent des objets ! Les objets y sont créés suivant un prototype (un autre objet) plutôt que par instanciation d'une classe.

Python, un langage objet à classes

Python est un langage orienté objet qui a deux caractéristiques importantes :

  • C'est un langage à classes : son approche orientée objet est dite « traditionnelle » et s'apparente de celle de Java ou C++, en différenciant les concepts de classe et d'objet.
  • Le programmeur n'est pas obligé d'employer une approche objet quand il produit du code Python : l'orientation objet est optionnelle, car Python est multi-paradigme et permet autant la programmation objet que la programmation fonctionnelle.

Création d'une classe

La déclaration d'une classe en Python est très simple, en utilisant le mot-clé class :

Code
class Personne(object):
    def __init__(self, nom, prenom=""):
        self.nom = nom
        self.prenom = prenom

p = Personne('Hendrix', 'Jimi')
print p.prenom, p.nom
print type(p)
print p.__class__.__name__
Exécution
Jimi Hendrix
<class '__main__.Personne'>
Personne

Quelques remarques importantes :

  • Tous les attributs et méthodes des classes Python sont « publics » au sens de C++, parce que « nous sommes tous des adultes ! » (citation de Guido van Rossum, créateur de Python).
  • Le constructeur d'une classe est une méthode spéciale qui s'appelle __init__().
  • En Python, on n'est pas tenu de déclarer tous les attributs de la classe comme dans d'autres langages : on peut se contenter de les initialiser dans le constructeur !
  • Toutes les méthodes prennent une variable self (sauf les méthodes de classe dont nous parlerons plus tard) comme premier argument. Cette variable est une référence à l'objet manipulé.

Héritage

Python supporte l'héritage simple et l'héritage multiple.

La création d'une classe fille est relativement simple, il suffit de préciser entre parenthèses le nom de la classe mère lors de la déclaration de sa fille.

Code
# -*- coding: UTF-8 -*-

class Personne(object):
    def __init__(self, nom, prenom=""):
        print("Initialisation de la personne {0}".format(id(self)))
        self.nom = nom
        self.prenom = prenom

class Etudiant(Personne):
    def __init__(self, numero, **kwargs):
        print("Initialisation de l'étudiant {0}".format(id(self)))
        super(Etudiant, self).__init__(**kwargs)
        self.numero = numero

p = Personne(nom='Hendrix', prenom='Jimi')
e = Etudiant(nom='Dupont', numero='125A2135')
print Etudiant.__mro__ # Affiche le MRO de la classe Etudiant
print e.nom, e.prenom, e.numero
Exécution
Initialisation de l'étudiant 4364845264
Initialisation de la personne 4364845264
(<class '__main__.Etudiant'>, <class '__main__.Personne'>, <type 'object'>)
Dupont  125A2135

Un élément important à remarquer est l'utilisation de la fonction super() : cette fonction permet, de manière « intelligente », de déléguer à la ou les classe(s) mère(s) l'exécution de certains traitements. On l'utilise donc notamment pour appeler, depuis une classe fille, le constructeur de la classe mère.

super() utilise l'algorithme du MRO (Method Resolution Order) pour parcourir l'arbre des héritages.

Livres sur la POO et Python

L'orienté objet avec Python

L'orienté objet avec Python

Voir

Conception et programmation orientées objet

Conception et programmation orientées objet

Voir