You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

108 lines
3.3 KiB

  1. Attributs et instances de classe
  2. ================================
  3. Rappels
  4. -------
  5. Voici un exemple de classe qui contient une méthode::
  6. class MaClasse
  7. def ma_méthode(self):
  8. print(self.mon_attribut)
  9. Le bloc indenté en-dessous du mot-clé ``class`` s'appelle le
  10. *corps* de la classe. Et les méthodes sont définies avec le
  11. mot-clé ``def`` dans le corps de la classe.
  12. On dit que ce sont des *méthodes d'instance* par ce qu'il
  13. faut créer une instance pour pouvoir les appeler::
  14. mon_instance = MaClasse()
  15. mon_instance.ma_méthode()
  16. Attributs de classes
  17. ---------------------
  18. On peut également déclarer des variables dans le corps d'une classe.
  19. On crée ainsi des *attributs de classe*::
  20. class MaClasse:
  21. mon_attribut_de_classe = 42
  22. Ici ``mon_attribut_de_classe`` existe *à la fois* dans les instances de ``MaClasse``
  23. et dans la classe elle-même::
  24. print(MaClasse.mon_attribut_de_classe)
  25. # affiche 42
  26. mon_instance = MaClasse()
  27. print(mon_instance.mon_attribut_de_classe)
  28. # affiche 42
  29. Un point important est que les attributs de classe sont *partagés* entre
  30. toutes les instances. Voici un exemple d'utilisation possible::
  31. class Voiture:
  32. nombre_total_de_voitures_fabriquées = 0
  33. def __init__(self, marque, couleur):
  34. print("Construction d'une", marque, couleur)
  35. Voiture.nombre_total_de_voitures_fabriquées += 1
  36. ferrari_1 = Voiture("Ferrari", "rouge")
  37. mercedes_1 = Voiture("Mercedes, "noire")
  38. ferrari_2 = Voiture("Ferrari", "rouge")
  39. print("total:", Voiture.nombre_total_de_voitures_fabriquées)
  40. # Affiche:
  41. # Construction d'une Ferrari rouge
  42. # Construction d'une Mercedes noire
  43. # Construction d'une Ferrari rouge
  44. # total: 3
  45. Notez que pour changer l'attribut de classe depuis une méthode, (comme dans le méthode
  46. ``__init__`` ci-dessus) on utilise le nom de la classe directement, et non pas ``self``.
  47. Méthodes de classes
  48. --------------------
  49. On peut aussi définir des méthodes de classes avec le décorateur `classmethod`
  50. Dans ce cas, le permier argument s'appelle ``cls`` et prend la valeur de la *classe*
  51. elle-même. Pour poursuivre sur notre exemple::
  52. class Voiture:
  53. nombre_total_de_voitures_fabriquées = 0
  54. def __init__(self, marque, couleur):
  55. print("Construction d'une", marque, couleur)
  56. Voiture.nombre_total_de_voitures_fabriquées += 1
  57. @classmethod
  58. def fabrique_ferrari(cls):
  59. return cls("ferrari", "rouge")
  60. ferrari = Voiture.fabrique_ferrari()
  61. Détaillons ce qu'il se passe sur la dernière ligne:
  62. à gauche du égal il y a une variable et à droite une expression(``Voiture.fabrique_ferrari()``)
  63. L'expression est constitué d'une classe à gauche du point (``Voiture``) et
  64. d'un attribut à droite du point ``fabrique_ferrari`` suivi de parenthèses.
  65. Comme ``fabrique_ferrari`` est une méthode de classe, on va appeler la méthode
  66. de classe ``fabrique_ferrari`` en lui passant la classe Courante en argument.
  67. On arrive ainsi dans le corps de la méthode de classe ``fabrique_ferrari``, et
  68. ``cls`` vaut la classe `Voiture`.
  69. Finalement, on évalue l'expression ``cls("ferrari", rouge")`` en remplaçant
  70. ``cls`` par sa valeur, ce qui donne ``Voiture("ferrari", "rouge")`` qui
  71. correspond bien à ce qu'on obtient : une instance de la classe Voiture.