DY

03 Python & la POO

Quelques rappels

Orienté objet

Les langage de programmation orienté 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.

En effet, il existe deux types de langages objet :

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 :

Notre première classe

class Chars(object):

    def __init__(self, name):
        self.name = name



char = Chars('Ben')
print char.name
print type(char)

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.

class Jedi(Chars):

    def __init__(self, name):
        super(Jedi, self).__init__(**kwargs)

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.

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