|
@@ -1,29 +1,47 @@
|
|
|
-Crée le fichier `03-classes.md` :
|
|
|
|
|
|
|
+Voici un extrait du fichier `03-classes-starwars.py` :
|
|
|
|
|
|
|
|
```python
|
|
```python
|
|
|
-class Vehicle:
|
|
|
|
|
- speed = 0
|
|
|
|
|
-
|
|
|
|
|
- def __init__(self, model):
|
|
|
|
|
- self.model = model
|
|
|
|
|
-
|
|
|
|
|
- def __str__(self):
|
|
|
|
|
- return self.model + ' (speed: %d km/h)' % (self.speed)
|
|
|
|
|
-
|
|
|
|
|
- def increase_spead(self, speed_increment):
|
|
|
|
|
- self.speed += speed_increment
|
|
|
|
|
-
|
|
|
|
|
-car = Vehicle('Land Rover')
|
|
|
|
|
-car.increase_spead(80)
|
|
|
|
|
-print(car)
|
|
|
|
|
|
|
+class ForceSensitive:
|
|
|
|
|
+ capacites_base = ["soulever des objets"]
|
|
|
|
|
+ # Ceci va être une variable "statique" (de classe)
|
|
|
|
|
+ nb_instances = 0
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, nom, capacites=[]):
|
|
|
|
|
+ # Assignation de deux
|
|
|
|
|
+ self.nom = nom
|
|
|
|
|
+ self.capacites = self.capacites_base + capacites
|
|
|
|
|
+ ForceSensitive.nb_instances += 1
|
|
|
|
|
+
|
|
|
|
|
+ def __str__(self):
|
|
|
|
|
+ return "Je suis {nom} ({genre}) et j'ai {nb} capacités :\n - {capacites}\n".format(
|
|
|
|
|
+ nom=self.nom, genre=type(self).__name__, nb=self.nb_capacites(), capacites="\n - ".join(self.capacites)
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ def nb_capacites(self):
|
|
|
|
|
+ return len(self.capacites)
|
|
|
|
|
+
|
|
|
|
|
+class Jedi(ForceSensitive):
|
|
|
|
|
+ capacites_base = [
|
|
|
|
|
+ "soulever des objets",
|
|
|
|
|
+ "combattre au sabre laser",
|
|
|
|
|
+ "influencer les esprits"
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+leia = ForceSensitive("Leia", ["jouer à Mary Poppins"])
|
|
|
|
|
+luke = Jedi("Luke", ["lancer un sabre avec classe", "entrer en lévitation"])
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-On utilise le même mot-clé `class` qu'en Java pour déclarer une classe. Logiquement, pas de `{}`, mais à nouveau l'indentation pour délimiter la classe : arrivé à la ligne qui instancie un `Vehicle`, l'interpréteur sait que le corps de la classe est terminé, car on est revenu au même niveau d'indentation que celui où on l'a déclarée.
|
|
|
|
|
|
|
+On utilise le même mot-clé `class` qu'en Java pour déclarer une classe.
|
|
|
|
|
+
|
|
|
|
|
+Logiquement, on utilise toujours l'indentation pour délimiter le corps de la classe. : arrivé à la ligne qui instancie un `Vehicle`, l'interpréteur sait que le corps de la classe est terminé, car on est revenu au même niveau d'indentation que celui où on l'a déclarée.
|
|
|
|
|
|
|
|
-Plusieurs choses là encore :
|
|
|
|
|
|
|
+Plusieurs choses concernant les classes. Retiens surtout les points 1, 2, 4 et 5 qui seront les plus utiles et les plus fréquemment utilisés !
|
|
|
|
|
|
|
|
-- Les propriétés d'instance (ici `speed`) sont déclarées les premières, juste en leur attribuant une valeur initiale.
|
|
|
|
|
-- Le constructeur de n'importe quelle classe est la méthode `__init__()`.
|
|
|
|
|
-- Note que celui-ci, **ainsi que les autres méthodes d'instance**, acceptent comme premier argument `self` (équivalent de `this` en Java ou JS). Oui, on passe à chaque méthode la référence à l'instance, c'est une habitude à prendre de
|
|
|
|
|
-- La méthode `__str__()` est l'équivalent de `toString()` en Java : elle renvoie une représentation en texte de l'objet.
|
|
|
|
|
-- Enfin, contrairement à Java ou JS, pas de mot-clé `new` pour créer une instance, mais juste le nom de la classe, avec les arguments requis par le constructeur entre parenthèses.
|
|
|
|
|
|
|
+1. Contrairement à Java ou JS, pas de mot-clé `new` pour créer une instance, mais juste le nom de la classe, avec les arguments requis par le constructeur entre parenthèses.
|
|
|
|
|
+2. Pour hériter d'une classe, on met le nom de la classe parente entre parenthèses, après le nom de la nouvelle classe (`Jedi` hérite de `ForceSensitive`).
|
|
|
|
|
+3. Les propriétés (ici `capacites_base` et `nb_instances`) sont déclarées les premières, juste en leur attribuant une valeur initiale. Note qu'on va utiliser `nb_instances` comme variable statique pour stocker le nombre d'instances. C'est le fait qu'on la référence via `ForceSensitive.nb_instances` qui en fait une propriété statique.
|
|
|
|
|
+4. Le constructeur de n'importe quelle classe est la méthode `__init__()`.
|
|
|
|
|
+5. Note que celui-ci, **ainsi que les autres méthodes d'instance**, acceptent comme premier argument `self` (équivalent de `this` en Java ou JS). Oui, on passe à chaque méthode la référence à l'instance, c'est une habitude à prendre de
|
|
|
|
|
+6. La méthode `__str__()` est l'équivalent de `toString()` en Java : elle renvoie une représentation en texte de l'objet.
|
|
|
|
|
+7. Dans cette dernière, on utilise une chaîne avec des emplacements nommés (`{nom}`, etc.), puis on insère les valeurs souhaitées grâce à `.format()` à laquelle on passe des *arguments nommés* (constate que les noms des arguments correspondent aux noms des emplacements).
|
|
|
|
|
+8. Pour récupérer le nom de la classe dont l'objet est une instance, on utilise `type(self).__name__` (tu n'es pas obligé de retenir ça !).
|