Aller au contenu

Cours

Introduction

Le programme officiel:

image

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 :

age = 1

Et qu'on affiche le type de la variable age:

print(type(age))

On obtient:

<class 'int'>

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

class Eleve:
    pass

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 :

leo.lire_cours()
jack.revasser()
ada.lire_cours()

Nous pouvons modifier la valeur des attributs :

leo.moyenne = 18
jack.moyenne = 7
ada.moyenne = 20

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

class Etudiant:
    def __init__(self, nom, age):
        self._nom = nom  # attribut protégé
        self._age = age # attribut protégé
class Etudiant:
    def __init__(self, nom, age):
        self.__nom = nom  # attribut privé
        self.__age = age # attribut privé

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