Cours
Introduction¶
Le programme officiel:
Vous avez utilisé des fonctions et ce qu'on appelle la programmation procédurale. La programmation orientée objet (POO) est un autre paradigme de programmation, c'est à dire une manière de concevoir la programmation. Dans un cours dédié aux paradigmes de programmation, nous verrons la programmation fonctionnelle, à ne pas confondre avec la simple utilisation de fonction, mais c'est une autre histoire. En Python on peut utiliser tous ces paradigmes en même temps. Trêve de bavardage, attaquons la POO !
{: .center}
Repères historiques¶
Comme de nombreux concepts informatiques, la POO n'est pas récente. Le début date des années 60. On cite notamment Java, un parangon de la programmation orientée objet.
- Simula 1967
- SmallTalk 1972
- Java 1995
Question
- Connaissez vous d'autres langages orientés objets ?
Classes¶
Vous avez déjà manipulé des classes en Python sans forcémment vous en rendre compte.
Par exemple si on écrit l'instruction :
Et qu'on affiche le type de la variable age:
On obtient:
On voit que même le type de base int
correspond à une classe.
Une classe est un moule qui va nous permettre de créer de multiples objets différents.
Créons notre première classe Eleve
Cette classe ne sert à rien pour le moment, le mot clé pass
permet de ne rien faire mais sans générer une erreur.
Méthodes et Attributs¶
Les méthodes sont des fonctions particulières liées à une classe qui permettent de stipuler des comportements.
Une des premières méthodes que nous pouvons utiliser est la méthode __init__
, appelée aussi constructeur, qui permet d'initialiser des variables que l'on appelle attributs
.
Comme les méthodes, les attributs sont liés à une classe.
class Eleve:
def __init__(self, nom, prenom, moyenne):
self.nom = nom
self.prenom = prenom
self.moyenne = moyenne
Les attributs (on dit aussi propriétés) de cette classe sont nom
, prenom
et moyenne
.
On peut ajouter maintenant des actions à notre élève :
class Eleve():
def __init__(self, nom, prenom, moyenne):
self.nom = nom
self.prenom = prenom
self.moyenne = moyenne
def lire_cours(self):
print(f'{self.nom}, {self.prenom} lit son cours')
def revasser(self):
print(f'{self.nom}, {self.prenom} rêve de POO')
N'oubliez pas le mot clé self
. Nous n'entrerons pas le détail de ce mot clé, mais sachez qu'il correspond à l'instance de la classe, aussi appelé objet
.
Exercice
- Quels sont les attributs de cette classe ?
class Enseignant():
def __init__(self, nom, prenom, age, matiere):
self.nom = nom
self.prenom = prenom
self.age = age
self.matiere = matiere
- Ajouter deux méthodes à cette classe
- Instanciez deux enseignants
Objets¶
On peut désormais démultiplier les élèves comme des pains :
leo = Eleve('Sedar Senghor', 'Leopold', 15)
jack = Eleve('Chan', 'Jackie', 8)
ada = Eleve('Lovelace', 'Ada', 19)
Vous venez de créer trois objets. Un objet n'est rien d'autre qu'une instance d'une classe.
Laissons les tranquillement rêvasser ou lire aux choix :
Nous pouvons modifier la valeur des attributs :
Observons l'exécution grâce à PythonTutor :
Remarques sur l'encapsulation¶
L'encapsulation permet en particulier de restreindre l'accès aux attributs et certaines méthodes en dehors de la classe. En Python néanmoins il s'agit principalement d'une convention de nommage car dans les faits on peut contourner cette limite d'accès. Pour cela les attributs et méthodes sont précédées par un underscore dans le cas où leur portée est protégé
, ou deux underscore pour une portée privée
.
Exemples
Encapsulation
Portée | Visible (accessible) par | |||
---|---|---|---|---|
(visibilité) | un membre de la classe | une classe dérivée | un client de l'objet | |
public | oui | oui | oui | Les membres publics sont aussi accessibles que l'objet instancié de cette classe (les membres déclarés dans cette portée sont visibles et utilisables par le client de l'objet). |
protégé | oui | oui | non | Les membres protégés ne sont accessibles que par les membres de l'objet instancié de cette classe et par les classes qui en sont dérivées. |
privé | oui | non | non | Les membres privés ne sont accessibles que par les membres de l'objet instancié de cette classe (ils ne sont pas accessibles par une classe fille ou le client de l'objet). |
Source : Wikipédia
Question
Quelle est la différence entre une classe et un objet ?
Bonus
-
Après avoir lu la documentation officielle au sujet de la méthode spéciale
__init__
, peut on en conclure que l'objet est créé en utilisant la méthode__init__
?
https://docs.python.org/3/reference/datamodel.html#special-method-names -
Etudier le code source de la librarie
scikit-learn
utilisée pour le machine learning, et cherchez des méthodes ou attributs privés ou protégés. https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/
Sources
La documentation officielle.
https://docs.python.org/3/tutorial/classes.html
Wikipédia.
https://fr.wikipedia.org/wiki/Classe_(informatique)