Voici un extrait du fichier `03-classes-starwars.py` :

```python
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, 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 concernant les classes. Retiens surtout les points 1, 2, 4 et 5 qui seront les plus utiles et les plus fréquemment utilisés !

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 !).