
class Person(object):
    """
    Classe représentant une personne.

    """
    nom: str = None
    prenom: str = None
    age: int = None

    def __init__(self, *_args, **kwargs):
        """
        Initialiser les valeurs d'une nouvelle personne.

        Args:
            *_args: Liste d'arguments non positionnels
            **kwargs: Arguments nommés, utilisés pour initialiser les attributs de notre objet.

        """
        self.nom = kwargs.get("nom", None)
        self.prenom = kwargs.get("prenom", None)
        self.age = kwargs.get("age", None)

    def set_nom_complet(self, nom, prenom):
        """
        Méthode pour définir les noms et prénom de l'individu.

        Args:
            nom: Nom de famille à attribuer
            prenom: Prénom à attribuer à l'objet

        """
        self.prenom = prenom
        self.nom = nom

    def get_nom_complet(self):
        """
        Méthode pour retrouver d'un coup le nom complet de l'individu.

        Returns:
            Nom complet, sous la forme "<prenom> <nom>"

        """
        if self.prenom and self.nom:
            return f"{self.prenom} {self.nom}"
        else:
            return "Nom complet non renseigné"


class Professional(Person):
    """
    Classe représentant un professionel, héritant de `Person`.

    """
    telephone_pro: str = None
    job: str = None

    def __init__(self, *_args, **kwargs):
        """
        Initialiser les données d'un nouveau professionel.

        On peut également initialiser le prénom, nom et âge.

        Args:
            *_args: Liste d'arguments non positionnels
            **kwargs: Liste d'arguments nommés, utilisés pour initialiser les attributs de notre objet.

        """
        super().__init__(*_args, **kwargs)
        self.telephone_pro = kwargs.get("telephone_pro", None)
        self.job = kwargs.get("job", None)

    def get_nom_complet(self):
        """
        Méthode pour retrouver d'un coup le nom complet de l'individu.

        Returns:
            Nom complet, sous la forme "<prenom> <nom>"

        """
        base_nom = super().get_nom_complet()
        return f"{base_nom} ({self.job})"


if __name__ == "__main__":
    # Ici on se crée plusieurs objets, 2 professionnels et une personne
    pro1 = Professional(nom="Mario", prenom="Mario", age=38, telephone_pro="0799999999", job="Jardinier")
    pro2 = Professional(nom="Mario", prenom="Luigi", age=37, telephone_pro="0799999999", job="Plombier")
    mec = Person(nom="Bertrand", prenom="Julien", age=30)
    # Les deux classe Person et Professional ont des méthodes `get_nom_complet()` différentes, tester
    print(mec.get_nom_complet())
    print(pro1.get_nom_complet())
