from typing import Optional


class Animal(object):
    """
    Classe de base pour tous les animaux.

    """
    pattes: int = None
    vertebre: Optional[bool] = None

    def manger(self):
        """
        Méthode de base pour que l'animal mange.

        On ne définit aucun comportement particulier ici.

        """
        print("Je suis un animal et je mange.")


class Chien(Animal):
    """
    Classe pour le chien.

    """
    pattes: int = 4
    vertebre = True

    def manger(self):
        """
        Méthode pour faire manger le chien.

        """
        super().manger()  # Exécute le code ligne 19
        print("Je dirais même plus *wouf* ! Je suis un chien qui mange.")


class Escargot(Animal):
    """
    Classe pour l'escargot.

    """
    pattes: int = 0
    vertebre = False

    def manger(self):
        """
        Méthode pour faire manger l'escargot.

        """
        print("Slurp *mange, mais on ne sait pas comment*")


if __name__ == "__main__":
    # Créer des nouvelles instances d'animaux
    escargot = Escargot()
    chien = Chien()
    # Et voir comment ça se comporte quand on appelle la méthode `manger`.
    # Le fait que plusieurs classes héritant d'une autre classe ont des comportements
    # différents pour les mêmes méthodes s'appelle du polymorphisme.
    # Les méthodes peuvent aussi avoir des arguments différents mais le même nom.
    print(escargot.manger())
    print(chien.manger())
