Browse Source

Relecture chapitres 5 et 6

master
Dimitri Merejkowsky 4 years ago
parent
commit
b856e21725
3 changed files with 103 additions and 13 deletions
  1. +1
    -1
      saison-2/sessions/Makefile
  2. +101
    -11
      saison-2/sessions/python-S02-E05.md
  3. +1
    -1
      saison-2/sessions/python-S02-E06.md

+ 1
- 1
saison-2/sessions/Makefile View File

@@ -1,4 +1,4 @@
all: python-S02-E06.pdf
all: python-S02-E05.pdf

%.pdf: %.md
pandoc --pdf-engine=xelatex -t beamer $< -o $@

+ 101
- 11
saison-2/sessions/python-S02-E05.md View File

@@ -36,7 +36,7 @@ x vaut 42

# Aparté - le mot-clé `pass`

En Python, à cause de l'organisation en blocs identés, on ne
En Python, à cause de l'organisation en blocs indentés, on ne
peut pas vraiment avoir de blocs vides. Mais parfois, on
a besoin d'un bloc qui ne fasse rien.

@@ -69,7 +69,7 @@ def ne_fait_rien():

# Changement de paradigme

Ce quon a vu jusqu’ici:
Ce qu'on a vu jusqu’ici:

* Des types simples (entiers, booléens, ...)
* Des structures de données (listes, dictionnaires, ...)
@@ -96,7 +96,7 @@ Je le mentionne juste parce que c'est une idée reçue très répandue.
# Orienté objet - 2ème définition

Une meilleure définition, c'est de dire que la programmation
orintée objet permet de mettre au même endroit:
orientée objet permet de mettre au même endroit:

* des données
* des fonctions qui opèrent sur ces données
@@ -126,7 +126,7 @@ class MonObjet:
# du code ici
```

Comme les fonctions, les classes contienent un *corps*, qui est le bloc *identé* en dessous
Comme les fonctions, les classes contiennent un *corps*, qui est le bloc *identé* en dessous
du mot-clé `class`, de nom de la classe et du `:` en fin de ligne

# Créons des objets
@@ -202,7 +202,7 @@ On peut *créer* des attributs dans *n'importe quel objet*, en utilisant l'*assi
# Création de l'attribut `x` dans `mon_instance`
>>> mon_instance.x = 42

# Accés à l'attribut `x` dans `mon_instance`
# Accès à l'attribut `x` dans `mon_instance`
>>> mon_instance.mon_attribut
42
```
@@ -237,7 +237,7 @@ Erreur
42
```

Notez qu'on ne passe *pas* d'argument quand on apelle `ma_méthode` depuis l'instance de l'objet.
Notez qu'on ne passe *pas* d'argument quand on appelle `ma_méthode` depuis l'instance de l'objet.


# Méthodes et attributs - 1
@@ -281,10 +281,10 @@ class MonObjet:

# Méthodes et attributs - 3

Les méthodes peuveunt aussi prendre plusieurs arguments, en plus de `self` - mais `self` doit
Les méthodes peuvent aussi prendre plusieurs arguments, en plus de `self` - mais `self` doit
toujours être le premier argument.

Par example, pour créer un attribut avec une certaine valeur:
Par exemple, pour créer un attribut avec une certaine valeur:


```python
@@ -396,14 +396,104 @@ nom de la classe:
* Attribut: variable dans un objet
* Instance: objet issue d'une classe
* Méthode: fonction dans une classe (qui prend `self` en premier argument)
* `__init__`: méthode magique appelée automatiquement pendant l'instaciation
* `__init__`: méthode magique appelée automatiquement pendant l'instanciation


# Classes et programmation orienté objet

Ainsi, on peut ranger au même endroit des données et des fonctions opérant sur ces donées.
Ainsi, on peut ranger au même endroit des données et des fonctions opérant sur ces données.

Les donées sont les attributs, et les fonctions opérant sur ces attributs sont les méthodes.
Les données sont les attributs, et les fonctions opérant sur ces attributs sont les méthodes.

On peut ainsi séparer les *responsabilités* à l'intérieur d'un code en les répartissant
entres plusieurs classes.

# Encapsulation

Définition: cacher à l'utilisateur de la classe certains détails du
fonctionnement de celle-ci.

On parle souvent d'opposition entre code *public*, utilisable à l'extérieur,
de la classe, et code *privé*, utilisé à l'intérieur de la classe.

Ou encore *d'interface* et de *d'implémentation*.

# Exemple

```python
class MonObject:
def __init__(self):
# Notez le tiret bas en début
# du nom de l'attribut
self._mon_attribut_privé = ...

def ma_méthode_publique(self):
return self._mon_attribut_privé

>>> mon_objet = MonObject()
>>> mon_objet.ma_méthode_publique()
```

# Conventions

Notez que rien ne vous empêche d'écrire:

```python
>>> mon_objet= MonObjet()
>>> mon_objet._mon_attribut_privé = "une-autre-valeur"
```

mais alors vous n'êtes plus dans le cas d'usage prévu
par l'auteur de la classe MonObjet.

# Exemple d'usage - 1

Si `_mon_attribut_privé` demande de longs calculs, on peut envisager de stocker le résultat
de façon à ce que le deuxième appel à `ma_méthode_publique()` soit plus rapide.

De l'extérieur, l'appel à `ma_méthode_publique()` sera "magiquement" plus rapide la deuxième
fois :)

# Exemple d'usage - 2

```python
class MonObject:
def __init__(self):
self._mon_attribut_privé = None

def ma_méthode_publique(self):
if self._mon_attribut_privé is None:
self._mon_attribut_privé = gros_calcul()
else:
return self._mon_attribut_privé

>>> mon_objet = MonObject()
>>> mon_objet.ma_méthode_publique()
# gros_calcul() est appelée
>>> mon_objet.ma_méthode_publique()
# retourne une valeur immédiatement!
```

#

\center \huge Atelier

# Consignes

Vous êtes développeur dans une usine de fabrication de robots.

* Quand les robots sortent de la chaîne de montage, ils n'ont pas encore de nom
* La première fois qu'on démarre un robot, un nom est généré au hasard, avec
le format suivant: deux lettres majuscules et trois chiffres. Par exemple:
`RX837` ou `BC811`
* De temps en temps, les robots sont remis à aux paramètres d'usine, le nom
est effacé et doit être regénéré

# Pour vous aider

* Un squelette `robot.py`, à récupérer sur `git.e2li.org`
* Contient déjà le `main()` de test - à vous d'implémenter la classe!





+ 1
- 1
saison-2/sessions/python-S02-E06.md View File

@@ -1,4 +1,4 @@
%e Programmation avec Python (chapitre 5)
% Programmation avec Python (chapitre 6)
% Dimitri Merejkowsky