| @@ -34,6 +34,39 @@ def ma_fonction(x): | |||||
| x vaut 42 | x vaut 42 | ||||
| ``` | ``` | ||||
| # Aparté - le mot-clé `pass` | |||||
| En Python, à cause de l'organisation en blocs identés, on ne | |||||
| peut pas vraiment avoir de blocs vides. Mais parfois, on | |||||
| a besoin d'un bloc qui ne fasse rien. | |||||
| Dans ce cas, on peut utiliser le mot-clé `pass`, par exemple | |||||
| après un if: | |||||
| ```python | |||||
| une_condition = False | |||||
| if une_condition: | |||||
| pass | |||||
| else: | |||||
| print("une_condition n'est pas vraie") | |||||
| ``` | |||||
| # Le mot-clé `pass` - 2 | |||||
| On peut aussi - et c'est l'usage le plus courant - utiliser `pass` pour | |||||
| définir une fonction qui ne fait rien: | |||||
| ```python | |||||
| def ne_fait_rien(): | |||||
| pass | |||||
| ``` | |||||
| ```python | |||||
| >>> ne_fait_rien() | |||||
| <rien> | |||||
| ``` | |||||
| # Changement de paradigme | # Changement de paradigme | ||||
| Ce qu’on a vu jusqu’ici: | Ce qu’on a vu jusqu’ici: | ||||
| @@ -62,25 +95,18 @@ Je le mentionne juste parce que c'est une idée reçue très répandue. | |||||
| # Orienté objet - 2ème définition | # Orienté objet - 2ème définition | ||||
| Mettre au même endroit: | |||||
| Une meilleure définition, c'est de dire que la programmation | |||||
| orintée objet permet de mettre au même endroit: | |||||
| * des données | * des données | ||||
| * des fonctions qui opèrent sur ces données | * des fonctions qui opèrent sur ces données | ||||
| L'important c'est que les deux aillent ensemble! | L'important c'est que les deux aillent ensemble! | ||||
| \vfill | |||||
| # Orienté objet - 3ème définition | |||||
| Des "cellules" qui s'envoient des "messages". | |||||
| Notamment, les cellules ne "voient" que leur état interne. | |||||
| On peut envoyer un message d'une cellule à une autre *sans* connaître | |||||
| beaucoup de détails à propos du destinataire du message. | |||||
| On a déjà vu ce concepts avec des fonctions fonctionnant en mode | |||||
| *boîte noire* du point de vue du code qui les appelle. | |||||
| *Note: ce n'est pas **la** meilleure définition de l'orienté objet, mais on s'en contentera | |||||
| pour le moment ...* | |||||
| # Les classes | # Les classes | ||||
| @@ -91,22 +117,28 @@ Mais notez bien qu'on peut faire de l'orienté objet *sans* classes! | |||||
| # Le plan de construction | # Le plan de construction | ||||
| La seule chose dont on a besoin pour construire un objet, c'est d'un *plan de construction*. | |||||
| Pour construire un objet en Python, on a besoin d'un *plan de construction*. | |||||
| On appelle ce plan une *classe* et on la définit ainsi: | On appelle ce plan une *classe* et on la définit ainsi: | ||||
| ```python | ```python | ||||
| class MonObjet: | class MonObjet: | ||||
| pass | |||||
| # du code ici | |||||
| ``` | ``` | ||||
| Ça ressemble un peu à la définition d'une fonction. Les noms des classes commencent souvent | |||||
| par une majuscule. | |||||
| Comme les fonctions, les classes contienent 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 | # Créons des objets | ||||
| On crée un objet en mettant le nom de la classe suivi d'une paire de parenthèses - | |||||
| On peut faire un plan de construction vide avec le mot clé pass: | |||||
| ```python | |||||
| class MonObjet: | |||||
| pass | |||||
| ``` | |||||
| Dans ce cas, on crée un objet en mettant le nom de la classe suivi d'une paire de parenthèses - | |||||
| un peu comme pour appeler une fonction: | un peu comme pour appeler une fonction: | ||||
| ```python | ```python | ||||
| @@ -117,7 +149,7 @@ Ici, `objet_1` est une *instance* de la classe `MonObjet`. | |||||
| # Attributs | # Attributs | ||||
| Les attributs sont des éléments _nommés_ "à l'intérieur" d'un objet. | |||||
| Les attributs sont des éléments **nommés** à *l'intérieur* d'un objet. | |||||
| On peut y accéder avec la syntaxe `<objet>.<attribut>`: | On peut y accéder avec la syntaxe `<objet>.<attribut>`: | ||||
| @@ -136,8 +168,8 @@ func = a.x | |||||
| func(10) | func(10) | ||||
| ``` | ``` | ||||
| Ici, on crée une variable `func` qui prend la valeur de l'attribut `x` dans `a`, puis | |||||
| on l'appelle dans la ligne suivante. | |||||
| Ici, on crée une variable `func` qui prend la valeur de l'attribut `x` dans l'objet `a`, puis | |||||
| on l'appelle avec l'argument `10` à la ligne suivante. | |||||
| Le code suivant fait exactement la même chose, mais avec une ligne de moins: | Le code suivant fait exactement la même chose, mais avec une ligne de moins: | ||||
| @@ -156,18 +188,18 @@ nombre_au_hasard = random.randint(0, 10) | |||||
| ``` | ``` | ||||
| Ici, `random` est un module, et `randint` est un *attribut* du module `random`. Il se trouve | Ici, `random` est un module, et `randint` est un *attribut* du module `random`. Il se trouve | ||||
| que cet attribut est un fonction qu'on peut appeler avec deux arguments. | |||||
| que cet attribut est une fonction qu'on peut appeler avec deux arguments. | |||||
| On reviendra sur les modules dans un prochain chapitre. | On reviendra sur les modules dans un prochain chapitre. | ||||
| # Attributs - 4 | # Attributs - 4 | ||||
| On peut *rajouter* des attributs à n'importe quel objet, en utilisant l'*assignation*: | |||||
| On peut *créer* des attributs dans *n'importe quel objet*, en utilisant l'*assignation*: | |||||
| ```python | ```python | ||||
| >>> mon_instance = MonObjet() | >>> mon_instance = MonObjet() | ||||
| # Création de l'attribut `x dans `mon_instance` | |||||
| # Création de l'attribut `x` dans `mon_instance` | |||||
| >>> mon_instance.x = 42 | >>> mon_instance.x = 42 | ||||
| # Accés à l'attribut `x` dans `mon_instance` | # Accés à l'attribut `x` dans `mon_instance` | ||||
| @@ -184,8 +216,6 @@ moins un argument appelé `self`, et être à l'intérieur du bloc de la classe: | |||||
| ```python | ```python | ||||
| class MonObjet: | class MonObjet: | ||||
| # le bloc 'def' est a l'intérieur du bloc | |||||
| # de la classe | |||||
| def ma_méthode(self): | def ma_méthode(self): | ||||
| return 42 | return 42 | ||||
| ``` | ``` | ||||
| @@ -337,7 +367,7 @@ class MonObjet: | |||||
| # \_\_init\_\_ - 2 | # \_\_init\_\_ - 2 | ||||
| On prend souvent les *valeurs* des attributs à créer en paramètres de la méthode `__init__ `. | |||||
| On prend souvent les *valeurs* des attributs à créer en arguments de la méthode `__init__ `. | |||||
| ```python | ```python | ||||
| class MonObjet: | class MonObjet: | ||||
| @@ -346,7 +376,7 @@ class MonObjet: | |||||
| self.y = y | self.y = y | ||||
| ``` | ``` | ||||
| Dans ce cas, les paramètres des `__init__` apparaissent à l'intérieur des parenthèses après le | |||||
| Dans ce cas, les arguments de la méthode `__init__` apparaissent à l'intérieur des parenthèses après le | |||||
| nom de la classe: | nom de la classe: | ||||
| ``` | ``` | ||||
| @@ -367,3 +397,13 @@ nom de la classe: | |||||
| * Instance: objet issue d'une classe | * Instance: objet issue d'une classe | ||||
| * Méthode: fonction dans une classe (qui prend `self` en premier argument) | * 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'instaciation | ||||
| # 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. | |||||
| Les doné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. | |||||