IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

POO: self en argument d'un appel d'une méthode [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut POO: self en argument d'un appel d'une méthode
    Bonjour,

    Je lis un bouquin sur la POO qui présente entre autre quelques exemples en python.

    Sur un exemple parlant de la cardinalité qui explicite les interactions entre les instances de deux classes différentes, il donne le code écrit ci dessous.

    Je ne comprends pas :
    - unInstrument.setMusicien(self)
    Si on regarde dans la classe Instrument, la méthode setMusicien a pour argument (self,monMusicien).
    On n'a pas mon musicien lors de son appel, pourquoi est ce que cela marche ?
    Il ne me semble pas avoir vu de self jusqu'à présent en appel d'une méthode, seulement lors de sa définition
    Pourquoi ne pas écrire : unInstrument.setMusicien(self.__nom) ? Cela fonctionne bien et cela me parait logique

    - Dans la classe Instrument, c'est quoi le "type" en argument du constructeur " def __init__(self,type): " ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class Musicien:
        __mesInstruments = [] #declaration de la liste, difficile de faire plus simple
        __nom = None
     
        def __init__(self,nom):
            self.__nom = nom
        def addInstrument(self,unInstrument):
            self.__mesInstruments.append(unInstrument) # ajout d un element a la liste
            unInstrument.setMusicien(self)
        def printInstrument(self):
            for x in self.__mesInstruments: #instruction tres elegante egalement
                print(x)
        def __str__(self):
            return self.__nom #definit ce qui apparait quand on appele le referent de l objet
     
    class Instrument:
        __monMusicien = None
        __type = None
        def __init__(self,type):
            self.__type = type
        def setMusicien(self,monMusicien):
            self.__monMusicien = monMusicien
        def printMusicien(self):
            print(self.__monMusicien)
        def __str__(self):
            return self.__type
     
    guitare = Instrument("guitare")
    #banjo = Instrument("banjo")
    django = Musicien("django")
    django.addInstrument(guitare)
    #django.addInstrument(banjo)
    django.printInstrument()
    guitare.printMusicien()
    #banjo.printMusicien()
    Merci

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    self représente l'objet instancié (créé) de la classe... donc quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unInstrument.setMusicien(self)
    Tu configures à ton instrument un objet créé par la classe Musicien soit le musicien django, donc un musicien dont le nom est donné par la valeur de l'attribut self.__nom appelé par la méthode spéciale __str__. Cette méthode représente l'appel à print(objet).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def__str__(self):
         return self.__nom #definit ce qui apparait quand on appele le referent de l objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    defprintMusicien(self):
         print(self.__monMusicien) # appel à la méthode __str__ de la classe Musicien
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    le self en python indique l'instance en cours, dans ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def addInstrument(self,unInstrument):
            self.__mesInstruments.append(unInstrument) # ajout d un element a la liste
            unInstrument.setMusicien(self)
    on passe à la méthode unInstrument.setMusicien(self) l'instance en cours de la classe Musicien donc l'objet django,
    car cette méthode attend comme le montre le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        def setMusicien(self,monMusicien):
            self.__monMusicien = monMusicien
    un objet de type Musicien.

    pour la 2eme question, le type ici doit être une chaine de caractère vu que vous utilisez la méthode __str__ pour retourner le type de l'instrument.

    edit: j'ai été devancé

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Merci pour les explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Appel d'une méthode dans une autre méthode
    Par lisa.a dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2010, 16h42
  2. Réponses: 3
    Dernier message: 29/04/2008, 14h14
  3. [POO] appel d'une méthode d'un autre fichier, le tout objet
    Par aaaaaaaa dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/07/2007, 18h43
  4. POO Trap lors de l'appel d'une méthode
    Par QAYS dans le forum Delphi
    Réponses: 3
    Dernier message: 05/06/2007, 21h22
  5. [PHP-JS] Variable PHP comme argument dans l'appel d'une fonction Javascript
    Par The Molo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/04/2007, 09h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo