Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
Tento repozitář je archivovaný. Můžete prohlížet soubory, klonovat, ale nemůžete nahrávat a vytvářet nové úkoly a požadavky na natažení.

python-S02-E05.md 7.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. % Programmation avec Python (chapitre 5)
  2. % Dimitri Merejkowsky
  3. #
  4. \center \huge Rappels sur les fonctions
  5. # Exemple 1
  6. ```python
  7. # Définition d'une fonction sans arguments
  8. def ma_fonction():
  9. print("ma_fonction commence ...")
  10. print("bonjour")
  11. print("ma_fonction finit.")
  12. # Appel de la fonction `ma_fonction`:
  13. >>> ma_fonction()
  14. ma_fonction commence ...
  15. bonjour
  16. ma_fonction finit.
  17. ```
  18. # Exemple 2
  19. ```python
  20. # Définition d'une fonction avec un argument, x:
  21. def ma_fonction(x):
  22. print("x vaut", x)
  23. # Appel de la fonction `ma_fonction`:
  24. >>> ma_fonction(42)
  25. x vaut 42
  26. ```
  27. # Changement de paradigme
  28. Ce qu’on a vu jusqu’ici:
  29. * Des types simples (entiers, booléens, ...)
  30. * Des structures de données (listes, dictionnaires, ...)
  31. * Des fonctions qui manipulent ces types ou ces types
  32. * Des fonctions qui s’appellent les unes les autres
  33. On appelle cet ensemble de concepts, cette façon d'écrire du code, un *paradigme* -
  34. et c'est un paradigme *procédural*.
  35. On va passer à un autre paradigme: l'*orienté objet*.
  36. # Orienté objet - une première définition
  37. Un "objet" informatique *représente* un véritable "objet" physique
  38. dans le vrai monde véritable.
  39. Ce n'est pas une très bonne définition:
  40. 1. Ce n'est pas nécessaire
  41. 2. Ce n'est même pas forcément souhaitable!
  42. Je le mentionne juste parce que c'est une idée reçue très répandue.
  43. # Orienté objet - 2ème définition
  44. Mettre au même endroit:
  45. * des données
  46. * des fonctions qui opèrent sur ces données
  47. L'important c'est que les deux aillent ensemble!
  48. # Orienté objet - 3ème définition
  49. Des "cellules" qui s'envoient des "messages".
  50. Notamment, les cellules ne "voient" que leur état interne.
  51. On peut envoyer un message d'une cellule à une autre *sans* connaître
  52. beaucoup de détails à propos du destinataire du message.
  53. On a déjà vu ce concepts avec des fonctions fonctionnant en mode
  54. *boîte noire* du point de vue du code qui les appelle.
  55. # Les classes
  56. On va parler *d'une* façon de faire de l'orienté objet: avec des classes.
  57. Mais notez bien qu'on peut faire de l'orienté objet *sans* classes!
  58. # Le plan de construction
  59. La seule chose dont on a besoin pour construire un objet, c'est d'un *plan de construction*.
  60. On appelle ce plan une *classe* et on la définit ainsi:
  61. ```python
  62. class MonObjet:
  63. pass
  64. ```
  65. Ça ressemble un peu à la définition d'une fonction. Les noms des classes commencent souvent
  66. par une majuscule.
  67. # Créons des objets
  68. On crée un objet en mettant le nom de la classe suivi d'une paire de parenthèses -
  69. un peu comme pour appeler une fonction:
  70. ```python
  71. >>> objet_1 = MonObjet()
  72. ```
  73. Ici, `objet_1` est une *instance* de la classe `MonObjet`.
  74. # Attributs
  75. Les attributs sont des éléments _nommés_ "à l'intérieur" d'un objet.
  76. On peut y accéder avec la syntaxe `<objet>.<attribut>`:
  77. ```python
  78. y = a.x
  79. ```
  80. Ici, `y` est l'attribut `x` de l'objet `a`.
  81. # Attributs - 2
  82. Les attributs peuvent être des fonctions:
  83. ```python
  84. func = a.x
  85. func(10)
  86. ```
  87. Ici, on crée une variable `func` qui prend la valeur de l'attribut `x` dans `a`, puis
  88. on l'appelle dans la ligne suivante.
  89. Le code suivant fait exactement la même chose, mais avec une ligne de moins:
  90. ```python
  91. a.x(10)
  92. ```
  93. # Attributs - 3
  94. On a déjà vu des attributs, quand on a utilisé des `modules`
  95. ```python
  96. import random
  97. nombre_au_hasard = random.randint(0, 10)
  98. ```
  99. Ici, `random` est un module, et `randint` est un *attribut* du module `random`. Il se trouve
  100. que cet attribut est un fonction qu'on peut appeler avec deux arguments.
  101. On reviendra sur les modules dans un prochain chapitre.
  102. # Attributs - 4
  103. On peut *rajouter* des attributs à n'importe quel objet, en utilisant l'*assignation*:
  104. ```python
  105. >>> mon_instance = MonObjet()
  106. # Création de l'attribut `x dans `mon_instance`
  107. >>> mon_instance.x = 42
  108. # Accés à l'attribut `x` dans `mon_instance`
  109. >>> mon_instance.mon_attribut
  110. 42
  111. ```
  112. # Méthodes - définition
  113. On peut aussi mettre des *méthodes* dans des classes.
  114. On utilise `def`, comme pour les fonctions, mais les méthodes *doivent* avoir au
  115. moins un argument appelé `self`, et être à l'intérieur du bloc de la classe:
  116. ```python
  117. class MonObjet:
  118. # le bloc 'def' est a l'intérieur du bloc
  119. # de la classe
  120. def ma_méthode(self):
  121. return 42
  122. ```
  123. # Méthodes - appel
  124. Une méthode ne peut être appelée que depuis une *instance* de
  125. l'objet:
  126. ```python
  127. class MonObjet:
  128. def ma_méthode(self):
  129. return 42
  130. >>> ma_méthode()
  131. Erreur
  132. >>> mon_instance = MonObjet()
  133. >>> mon_instance.ma_méthode()
  134. 42
  135. ```
  136. Notez qu'on ne passe *pas* d'argument quand on apelle `ma_méthode` depuis l'instance de l'objet.
  137. # Méthodes et attributs - 1
  138. `self` *prend la valeur de l'instance courante* quand la méthode est appelée.
  139. On peut le voir en utilisant des attributs:
  140. ```python
  141. class MonObjet:
  142. def affiche_attribut_x(self):
  143. # Accès à l'attribut `x` dans `self`
  144. print(self.x)
  145. >>> mon_instance = MonObjet()
  146. >>> mon_instance.x = 42
  147. >>> mon_instance.affiche_attribut_x()
  148. 42
  149. ```
  150. # Méthodes et attributs - 2
  151. On peut aussi *créer* des attributs dans une méthode:
  152. ```python
  153. class MonObjet:
  154. def crée_attribut_x(self):
  155. self.x = 42
  156. def affiche_attribut_x(self):
  157. print(self.x)
  158. >>> mon_instance = MonObjet()
  159. >>> mon_instance.affiche_attribut_x()
  160. # Erreur: `mon_instance` n'a pas d'attribut `x`
  161. >>> mon_instance.crée_attribut_x()
  162. >>> mon_instance.affiche_attribut_x()
  163. 42
  164. ```
  165. # Méthodes et attributs - 3
  166. Les méthodes peuveunt aussi prendre plusieurs arguments, en plus de `self` - mais `self` doit
  167. toujours être le premier argument.
  168. Par example, pour créer un attribut avec une certaine valeur:
  169. ```python
  170. class MonObjet
  171. def crée_attribut_x(self, valeur_de_x):
  172. self.x = valeur_de_x
  173. def affiche_attribut_x(self);
  174. print(self.x)
  175. >>> mon_instance = MonObjet()
  176. >>> mon_instance.crée_attribut_x(42)
  177. >>> mon_instance.affiche_attribut_x()
  178. 42
  179. ```
  180. # Méthodes appelant d'autres méthodes - 1
  181. Comme les méthodes sont *aussi* des attributs, les méthodes d'un objet peuvent s'appeler
  182. les unes les autres:
  183. ```python
  184. class MonObjet:
  185. def méthode_1(self):
  186. print("démarrage de la méthode 1")
  187. print("la méthode 1 affiche bonjour")
  188. print("bonjour")
  189. print("fin de la méthode 1")
  190. def méthode_2(self):
  191. print("la méthode 2 appelle la méthode 1")
  192. self.méthode_1()
  193. print("fin de la méthode 2")
  194. ```
  195. # Méthodes appelant d'autres méthodes - 2
  196. ```python
  197. >>> mon_instance = MonObjet()
  198. >>> mon_instance.méthode_2()
  199. ```
  200. ```text
  201. la méthode 2 appelle la méthode 1
  202. démarrage de la méthode 1
  203. la méthode 1 affiche bonjour
  204. bonjour
  205. fin de la méthode 1
  206. fin de la méthode 2
  207. ```
  208. # Une méthode spéciale
  209. Si vous définissez une méthode `__init__`, celle-ci est appelée *automatiquement*
  210. quand l'objet est construit.
  211. On dit que c'est une méthode "magique" parce qu'elle fait quelque chose _sans_ qu'on
  212. l'appelle explicitement.
  213. # \_\_init\_\_
  214. On utilise souvent `__init__` pour créer des attributs
  215. ```python
  216. class MonObjet:
  217. def __init__(self):
  218. self.x = 1
  219. self.y = 2
  220. >>> mon_instance = MonObjet()
  221. # __init__ est appelée automatiquement!
  222. >>> mon_instance.x
  223. 1
  224. >>> mon_instance.y
  225. 2
  226. ```
  227. # \_\_init\_\_ - 2
  228. On prend souvent les *valeurs* des attributs à créer en paramètres de la méthode `__init__ `.
  229. ```python
  230. class MonObjet:
  231. def __init__(self, x, y):
  232. self.x = x
  233. self.y = y
  234. ```
  235. Dans ce cas, les paramètres des `__init__` apparaissent à l'intérieur des parenthèses après le
  236. nom de la classe:
  237. ```
  238. >>> mon_instance = MonObjet(3, 4)
  239. >>> mon_instance.x
  240. 3
  241. >>> mon_instance.y
  242. 4
  243. ```
  244. *Pour cette raison, `__init__` est souvent appelé le _constructeur_ de la classe.*
  245. # Récapitulatif
  246. * Classe: plan de construction
  247. * Objet: ce qu'on crée avec le plan
  248. * Attribut: variable dans un objet
  249. * Instance: objet issue d'une classe
  250. * Méthode: fonction dans une classe (qui prend `self` en premier argument)
  251. * `__init__`: méthode magique appelée automatiquement pendant l'instaciation