Résolue

Heritage : petite question

# Méthodes # Héritage

Gabriel Trouvé

Mentor

Bonsoir,

Je pense avoir bien compris l'héritage.

En fait la seul chose que l'on a à mettre dans notre class fille c'est le def__init__ ?

Toutes les autres méthodes sont récupérés direct dans la class parent sauf init ?


Merci d'avance

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

Gabriel Trouvé

Mentor

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 Gabriel,


l'héritage que tu fais ici est nickel, quel est ton problème ?

Gabriel Trouvé

Mentor

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 ?

Gabriel Trouvé

Mentor

D'accord merci PA. C'est OK pour moi.

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.