Programmation objet en Python : classes, héritage…
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
:
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__
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écutionInitialisation 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.