Résolue

Quel besoin de faire Utilisateur.__init__(self, nom, prenom) ici?

# Orienté objet # Héritage # VSCode

Bonjour, pourquoi dans la classe Junior de l'exemple de la vidéo, y a-t-il besoin d'écrire::
Utilisateur.init(self, nom, prenom) ?
La classe Junior n'hérite-t-elle pas direment du constructeur de la classe mère? J'ai fait un test dans VSC en indiquant simplement pass comme contenu de la classe Junior, et tout fonctionne de la même manière. Merci de vos lumières!

Thibault houdon

Mentor

Bonjour Simon,

Très bonne question Simon. Effectivement tu n'as pas besoin de le faire. Ce n'est pas une obligation et tu pourrais créer une classe qui contient juste un pass à l'intérieur et ça fonctionnerait également. Cependant il est rare que l'on fasse cela et comme tu as pu le voir probablement dans la vidéo qui suit, on utilise souvent l'héritage pour faire de la surcharge (comme je le montre avec afficher_projets).

Et c'est dans ce contexte qu'on utilise la fonction super à l'intérieur de la méthode __init__ pour par exemple définir des attributs différents dans les classes filles automatiquement.

Exemple :

class Utilisateur:
    def __init__(self, nom, prenom, role):
        self.nom = nom
        self.prenom = prenom
        self.role = role

    def __str__(self):
        return f"{self.prenom} {self.nom.upper()}"

class Junior(Utilisateur):
    def __init__(self, nom, prenom):
        super().__init__(nom=nom, prenom=prenom, role="Junior")


user = Junior("Durand", "Paul")
print(user.role)

Donc en soit ce n'est pas une obligation, et si ta méthode __init__ est exactement la même, tu peux ne pas la mettre et par défaut la classe fille utilisera la méthode du parent.

Si tu souhaites la redéfinir, tu peux surcharger la méthode dans la classe fille et utiliser super si tu souhaites quand même appeler la méthode parente.

Attention dans ce cas-ci, l'ordre a une importance !

class Utilisateur:
    def __init__(self, nom, prenom, role="Superuser"):
        self.nom = nom
        self.prenom = prenom
        self.role = role

class Junior(Utilisateur):
    def __init__(self, nom, prenom):
        self.role = "Junior"
        super().__init__(nom=nom, prenom=prenom)


user = Junior("Durand", "Paul")
print(user.role)  # Superuser

Ici on définit le rôle sur Junior mais on le redéfinit par la suite avec l'appel à la méthode __init__ du parent. Il faudrait donc redéfinir le rôle après l'appel à super :

class Utilisateur:
    def __init__(self, nom, prenom, role="Superuser"):
        self.nom = nom
        self.prenom = prenom
        self.role = role

class Junior(Utilisateur):
    def __init__(self, nom, prenom):
        super().__init__(nom=nom, prenom=prenom)
        self.role = "Junior"


user = Junior("Durand", "Paul")
print(user.role)  # Junior

C'est bien clair, merci!

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.