> Concept fondamental dans la programmation moderne : **la Programmation Orientée Objet**, ou **POO** pour les intimes, est un changement de paradigme par rapport à ce qu’on a vu jusqu’ici.
Nous allons organiser notre programme en utilisant des **objets**.
Ces objets, c’est un peu comme des boîtes qui contiennent à la fois des **données** (des variables, qu’on appelle des **attributs**) et des **comportements** (des fonctions, qu’on appelle des **méthodes**).
Chaque objet va représenter une sorte de “petit être” autonome, capable de manipuler ses propres données et d’interagir avec d’autres objets.
L’idée principale derrière la POO, c’est de **modéliser le monde réel** ou des concepts abstraits en utilisant des **classes** et des objets. Une classe, c’est une sorte de plan ou de moule qui permet de créer des objets. Un peu comme un plan d’architecte pour construire des maisons : la classe, c’est le plan ; l’objet, c’est la maison.
## Le programme

----------
## Rappel : Programmation impérative
La programmation impérative est un paradigme de programmation (une méthode de programmation) composé d'une suite d'instructions. C'est le type de programmation que l'on utilise jusqu'à présent. On retrouve ce paradigme dans les langages tels que Python, Javascript ou encore le langage C.
Si par exemple nous voulons créer un code qui utiliserait des étudiants, stockerait leurs spécialités, leur âge, leur nom, etc. Nous pourrions utiliser un dictionnaire par exemple.
Ici le dictionnaire contient des informations qui peuvent s'apparenter à un étudiant. Il est possible de changer les clés, les valeurs des clés. Mais en réalité nous manipulons un dictionnaire. Si nous vérifions le type de *dico* il s'agit d'un dictionnaire, non d'un étudiant.
La programmation objet va permettre de créer un type *Etudiant* qui contiendra des caractéristiques qui lui sont propres (nommées **attributs**) et des fonctions appropriées (nommées **méthodes**).
La programmation orientée objet permet donc de créer son propre type. Le langage python possède nativement différents types tels que le type int, str, list (tableau), dict.
Ces types possèdent des méthodes, par exemple le type str possède la méthode *upper()* permettant de mettre en majuscules tous les caractères de la chaîne.
```python
>>> s = 'Je suis un type str'
>>> s.upper()
'JE SUIS UN TYPE STR'
```
Le but ici est donc de réaliser la même chose sur un type que nous allons créer. (le type *Etudiant*)
> Il est important que le nom de la classe commence par une majuscule.
### Le constructeur
Le constructeur est une méthode(fonction) permettant d'initialiser votre type. Lorsque l'on va créer un étudiant c'est la méthode constructeur qui est appelée. En python elle est définie par '\_\_init\_\_()'
<u>Voici le constructeur pour notre classe *Etudiant* :</u>
- *\_\_init\_\_* est une méthode de constructeur, son nom ne doit pas changer.
- ***self* est un paramètre que l'on retrouvera dans toutes les méthodes de nos classes.**
- *self* permet de désigner l'objet que l'on manipule
- ***nom, prenom, spe1, age, nom_complet, peut_avoir_son_permis* sont des **attributs** de la classe *Etudiant*
- Un étudiant est donc composé d'un nom, prénom, spe1, age, permis_voiture et d'un nom_complet.
- ***nom_etu,prenom_etu,spe1_etu,age_etu*** sont ici les paramètres de la fonction. Pas des attributs.
- L'attribut *peut_avoir_son_permis* est le résultat d'une condition.
- Il est possible de boucler, de mettre des conditions dans un constructeur
> Le constructeur est une fonction comme une autre, pouvant comporter des boucles, des conditions. L'utilité principale de celui-ci est avant tout de créer les attributs de notre objet.
A ce stade nous pouvons créer notre objet *Etudiant*
```python
>>> e = Etudiant('Dupond','Bob','NSI',17)
>>> e.nom
'Dupond'
>>> e.peut_avoir_son_permis
False
>>> e.age
17
```
> Le paramètre self correspond ici à e. Il n'apparait pas dans les parenthèses. Il s'agit de la variable stockant l'objet (e ici)
Une fois notre constructeur créé il faut pouvoir manipuler l'objet. Ici nous pouvons accéder à ses attributs. Mais nous allons créer des méthodes permettant de changer, ajouter des attributs.
Ici nous utilisons la spé de l'étudiant 2 (Alice) pour l'étudiant 1. Il y a peu d'intérêt dans cet exemple, mais il permet de démontrer que c'est possible.
<arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><imgalt="Licence Creative Commons"style="border-width:0"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/></a><br/>Ce cours est mis à disposition selon les termes de la <arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.