Heritage : petite question
Bonsoir Gabriel,
C'est un peu plus compliqué que ça
En fait, les classes filles ont accès à tout ce qui se trouve dans la classe parent : méthodes et attributs, donc même ce qui se trouve dans init de la classe parent
En général, déclarer une classe fille seule ne sert à rien, autant n'avoir qu'une seule classe
Le but des classes filles, c'est d'avoir des attributs et des méthodes différents entre elles, mais qui utilisent toutes les 2 quand même la partie commune de la classe parent.
Exemple, dans un jeu, tu as une classe parent "Personnage", une classe fille "Joueur" et une classe fille "Ennemi"
Donc tu peux avoir ceci :
class Personnage:
def __init__(self, name):
self.name = name
self.PV = 50
def damage(enemy):
pass
class Joueur(Personnage):
def __init__(self):
super().__init__()
self.xp = 0
self.gold = 0
def prendre_postion(self):
pass
class Enemy(Personnage):
def __init__(self):
super().__init__()
self.objet _en_poche: "épée en fer"
def laisser_objet(self)
pass
Le joueur et l'ennemi ont un nom et des points de vie et ils peuvent tous les 2 faire des dégâts
Le joueur seul peut prendre une potion et il peut gagner de l'or et de l'xp
L'ennemi seul peut avoir un objet sur lui et le laisser tomber
Donc, tu vois tu as un tronc commun (classe parent) utilisé par toutes les classes filles, mais les classes filles peuvent avoir des attributs et des méthodes bien distinctes en plus
J'espère que c'est assez clair
Merci de me corriger si je me suis trompé
Romuald
Dans la formation on déclare pourtant le init dans la class fille qui fait ref à la class parent :
ma class junior qui est une class fille commence par la méthode init
""" l'héritage:
éviter la répétition
"""
#pr dans notre exemple sont protégés
#je ne veux pas que Paul y ait accès
projets = ["pr_GameOfThrones", "HarryPotter", "pr_Avengers"]
class Utilisateur:
def __init__(self, nom, prenom):
self.nom = nom
self.prenom = prenom
def __str__(self):
return f"Utilisateur {self.nom} {self.prenom}"
def afficher_projets(self):
for projet in projets:
print(projet)
class Junior(Utilisateur):#junior est donc une class fille de la class utilisateur qui est une class parent
def __init__(self, nom, prenom):
super().__init__(nom, prenom)#on appelle init de class parent
#toujours utiliser la fonction super pour récupérer le nom de la class parent
#ensuite on va utiliser la SURCHARGE, cad récupérer une méthode parents, l'écraser pour
#redéfinir dans class enfant
def afficher_projets(self):
for projet in projets:
if not projet.startswith("pr_"):
print(projet)
paul = Junior("Paul", "Durand")
print(paul)
paul.afficher_projets()#comme on a redefini afficher_projet dans junior c'est méthode junior utilisée
""" Dans ma class fille je n'ai pas besoin de re-coder les méthodes,
J'ai juste à créer une méthode init qui fait appel à l'init de ma class parent. C'est tout.
Ici j'ai redéfibi la méthode afficher_projets car j'ai des projets sensibles."""
Salut PA,
en gros, dans la class fille, j'ai accès à toutes les méthodes de la class parent.
Mais je suis quand même obligé de mettre dans ma class fille en début de script :
la méthode __init__ ?
class Junior(Utilisateur):#junior est donc une class fille de la class utilisateur qui est une class parent
def __init__(self, nom, prenom):
super().__init__(nom, prenom)
Oui tu es obligé,
le __init__() de ta classe fille te sert à pouvoir passer des argument quand tu créés ton instance. Quand tu créés une instance et que tu fais par exemple
junior = Junior("jean")
si tu n'a pas de constructeur dans ta classe mais si c'est une classe fille, tu ne pourras pas lui passer au moins l'argument que tu veux pour la classe mère (ici "jean").
J'espère que c'est clair ?
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte