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 :

Est-il possible d'instancier un objet de classe à partir d'une liste ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut Est-il possible d'instancier un objet de classe à partir d'une liste ?
    Bonjour à tous,

    Dans l'exemple ci-après, une liste contient 3 noms avec lesquels je souhaiterais créer 3 instances de la classe 'Rectangle'.
    Il semble que le code de création fonctionne puisque le calcul de surface est exact.
    Si les instances sont donc crées comment faire pour les ré-utiliser dans la suite du code.
    Quelque chose dans le genre des lignes 27 et 28.

    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
     
     
    # -*- coding: UTF-8 -*-
     
    class Rectangle(object):
        """ Classe Rectangle """
        def __init__(self, long, larg):
            self.long = long
            self.larg = larg
     
        def surface(self):
            """ simple calcul de surface """
            return  self.long * self.larg #, self.nom
     
     
    def lancer():
        LesRectangles = ['r1', 'r2', 'r3']
        for i in range(1,4):
            lo = 10 + i * 10
            la = 20 + i * 10
     
            r = LesRectangles[i-1]; print("valeur de 'r' ici ", r)
            r = Rectangle(lo, la)
            print("surface de ", LesRectangles[i-1], r.surface())
     
        print("choix ", LesRectangles[1]) # pour vérif donne --> r2 (correct)
    ##    print("surface de ", globals()[LesRectangles[1]].surface()) # --> erreur
        print("surface de ", r2.surface()) # --> erreur
     
    ##        lancer()
     
    lancer()

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Bonjour,

    Vous créez un une instance dans votre boucle for, instance qui s'appelle r. A chaque itération de la boucle vous créez une nouvelle instance mais stockée dans la même variable r. En sortie de votre boucle vous n'avez conservé que la dernière instance. De plus, aucune variable ne s'appelle r2.

    Si vous voulez réutiliser les rectangles, il vous faut les stocker. Une solution possible ici est de les ranger dans un dictionnaire dont la clé sera le nom du rectangle, et la valeur le rectangle lui-même (ou plutôt une instance). Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def lancer():
        LesRectangles = dict()
        for i in range(1, 4):
            lo = 10 + i * 10
            la = 20 + i * 10
            LesRectangle['r' + str(i)] = Rectangle(lo, la)
    Par la suite, en dehors de la boucle for, vous pouvez faire LesRectangles['r2'].surface().

    J

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Salut julien et merci pour cette réponse rapide,

    C'est bien la solution que je cherche.
    Je comprends, en ligne 22, la variable r change de valeur mais pas de nom.
    Est-il possible à ce moment là de convertir cette valeur en nom de variable ?
    - c'est juste pour comprendre.
    Encore merci.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par luc pic Voir le message
    Est-il possible à ce moment là de convertir cette valeur en nom de variable ?
    Oui c'est possible via eval() mais ce n'est pas la bonne façon de faire.
    Julien a donné la bonne solution. Quand on a plusieurs items de même nature (plusieurs int, plusieurs str, plusieurs rectangles) on utilise des structures adaptées à les stocker (ie les tableaux qui permettent ensuite de les traiter par itération). Sous Python, les tableaux se déclinent en tuples (tableaux non modifiables) et listes (tableaux modifiables). Plus des dictionnaires qui permettent alors d'associer des noms aux items (et non plus des indices). Ce qui correspond parfaitement à ton problème.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LesRectangles = dict()
    for (i, s) in enumerate(("r1", "r2", "r3"), 1):
        LesRectangles[s]=Rectangle(10 + i * 10, 20 + i * 10)
     
    for (k, v) in LesRectangles.items():
        print(k, v.surface())
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Salut Sve@r et merci aussi,

    C'est lumineux, je pense avoir bien compris le principe des listes et dictionnaires mais c'est leur utilisation avec les classes que j'ai besoin de recaler un peu.

    En fait, je rechignais à utiliser un dictionnaire car j'avais l'impression que je stockais 2 fois chaque instanciation.
    Une fois dans le dico et aussi ailleurs dans une autre partie de la mémoire.

    Un 'print(Rectangle(lo, la))' à chaque instanciation revoie chaque fois une adresse du genre:
    <__main__.Rectangle object at 0x0000000003282E48>
    L'instance est donc stockée mais impossible d’accès.

    C'est cet accès que je cherchais à obtenir en lui donnant un nom itératif.

    Encore merci.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luc pic Voir le message
    Un 'print(Rectangle(lo, la))' à chaque instanciation revoie chaque fois une adresse du genre:
    <__main__.Rectangle object at 0x0000000003282E48>
    Effectivement, ici tu affiches une instance créée "à la volée" et non sauvegardée. Elle est créée, affichée, puis supprimée. Là non plus ce n'est pas bon. C'est un peu comme si tu avais écrit a=5; print(5). Ok tu as "5" à l'écran mais aucun rapport avec "a".

    Citation Envoyé par luc pic Voir le message
    L'instance est donc stockée mais impossible d’accès.
    Même pas stockée. Rajoutes des print() au __init__() et au __del__() et tu verras les moments de la création et de la suppression
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [HTML 4.0] Est-il possible de connaitre l'index d'un élément d'une liste déroulante ?
    Par beegees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 01/05/2009, 20h53
  2. Réponses: 21
    Dernier message: 02/06/2008, 16h40
  3. Réponses: 4
    Dernier message: 21/05/2008, 13h40
  4. Réponses: 2
    Dernier message: 19/09/2007, 10h21
  5. Est il possible de dissocier un objet placer ds un GroupBox
    Par Yphon dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/01/2006, 10h45

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