Quel besoin de faire Utilisateur.__init__(self, nom, prenom) ici?
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!
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
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte