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 :

Créer instance objet d’une classe dans une autre classe


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2018
    Messages : 114
    Points : 61
    Points
    61
    Par défaut Créer instance objet d’une classe dans une autre classe
    Bonjour,

    J’ai 2 classes :
    Une classe Variable qui comprend 1 variable x.
    Depuis une autre classe, j’instancie ma classe variable instvar
    Dans mon programme main, je créer un objet de ma class InstanceVariables sur laquelle je boucle pour alimenter la liste ptest. Malheureusement, dès que l’indice 0 de mon objet se met à jour, il met aussi à jour l’indice 1 … merci pour votre aide

    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
     
    class Variables:
         x=0
    class InstanceVariables:
         instvar = Variables()
     
    def main():
        ptest = []
        for i range(2):
             create_test = InstanceVariables()
             ptest.append(create_test)
     
         ptest[0].instvar.x = 1
     
     
    if __name__.endswith(__main__):
        main()

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    4 210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 4 210
    Points : 6 629
    Points
    6 629
    Par défaut
    Salut,

    Un attribut de classe est utilisé lorsque une valeur doit rester identique pour toutes les instances de cette classe. Généralement une valeur constante.

    Ce dont tu as besoin, toi, c'est d'un attribut d'instance, qui pourras différer pour chaque instance.

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Variables:
        def __init__(self):
            self.x = 0
     
    class InstanceVariables:
        def __init__(self):
            self.instvar = Variables()

  3. #3
    Membre expérimenté
    Inscrit en
    février 2003
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : février 2003
    Messages : 1 272
    Points : 1 356
    Points
    1 356
    Par défaut
    Dans mon adaptation (python 3.9) de ton code, j'ai bien l'attribut x qui vaut 1 dans la première instance et 0 pour l'attribut x dans la seconde.

    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
    class Variables:
        def __init__(
            self,
        ) -> None:
            '''Constructor'''
            self.x: int = 0
     
     
    class InstanceVariables:
        def __init__(
            self,
        ) -> None:
            '''Constructor'''
            self.instvar: Variables = Variables()
     
     
    def main():
        ptest: list[InstanceVariables] = []
        for i in range(2):
            ptest.append(InstanceVariables())
        ptest[0].instvar.x = 1
        for instance in ptest:
            print(instance.instvar.x)
     
     
    if __name__ == '__main__':
        main()

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    9 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 9 639
    Points : 26 317
    Points
    26 317
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par nivk-539 Voir le message
    Malheureusement, dès que l’indice 0 de mon objet se met à jour, il met aussi à jour l’indice 1 …
    C'est normal. x est un attribut de classe donc unique pour toutes les instances de la classe. Si une instance modifie ce "x", il est modifié pour toutes.
    Tu veux un attribut associé à une instance il te faut un attribut d'instance. Tu le définis/remplis dans les fonctions dédiées à gérer l'instance (__init__() en général) et tu l'affectes à l'instance en cours (nommée "self" par convention).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

Discussions similaires

  1. [XL-2007] Excel 2007 :Transposer les données d’une colonne dans une autre
    Par dayamaya dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/09/2018, 16h17
  2. Réponses: 1
    Dernier message: 17/10/2012, 17h18
  3. Transposer le contenu d’une table dans une autre:
    Par Bonero dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/09/2012, 00h58
  4. Réponses: 1
    Dernier message: 28/03/2011, 14h00
  5. Récupérer un objet se trouvant dans une autre fonction
    Par Shinochi dans le forum Débuter
    Réponses: 4
    Dernier message: 03/10/2010, 19h30

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