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 :

Contenu d'une variable et objet


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Contenu d'une variable et objet
    Bonjour à tous.

    J'aimerai savoir s'il est possible d'instancier un objet à partir du contenu d'une variable ?

    Par exemple : j'ai une classe Monobjet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class Monobjet:
    """definition de Monobjet"""
    def __init__(self):
    self.couleur = "rouge"
    et j'ai une variable a de type string dont la valeur est "toto" :

    Comment faire pour instancier un objet toto, obtenir par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>>print toto.couleur
    'rouge'
    Désolé si ça vous parait débile, mais, en vieux programmeur habitué au procédural, j'ai un peu (beaucoup) de mal avec programmation orientée objet.

    Pour information, ce que je souhaite faire est de pouvoir créer des objets à partir d'une liste ( ou d'un dictionnaire). Cette liste est constituée à partir de données provenant d'un SGBD, mais je n'en connais pas les valeurs à l'avance.

    En tout cas merci d'avance de vos réponses

  2. #2
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>a = "toto"
    >>locals()[a] = Monobjet()
    >>print toto.couleur
    rouge

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 059
    Points : 1 396
    Points
    1 396
    Par défaut
    ou aussi ( moins propre que la solution de Tyrus )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>a = 'toto'
    >>exec(a+'=Monobjet()')
    >>toto.couleur
    rouge

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Pourquoi ne pas utiliser un dictionnaire, ça serait quand même plus propre:

    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
     
    class Monobjet:
    	def __init__(self, clr):
    		self.couleur = clr
     
    monDico = {}
     
    a = "toto"
    b = "titi"
     
    monDico[a] = Monobjet("rouge")
    monDico[b] = Monobjet("vert")
     
    print monDico["toto"].couleur
    print monDico["titi"].couleur

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je suis d'accord avec nyko77.

    Il y a régulièrement des questions de ce genre sur ce forum (comment créer un variable dont le nom est dans une chaîne de caractères). En dehors de cas très limités de méta-programmation, c'est à éviter. Il s'agit souvent de créer une variable dont le nom provient d'une opération d'entrée/sortie, ce qui me rappelle le vieux code PHP avec register_globals activé. Ce n'est pas pour rien que cette directive est dépréciée et sera retirée en PHP...
    Et en dehors du fait que cela pose des problèmes de sécurité, il me semble que cela nuit à la distinction entre ce qui constitue le code et ce qui constitue les données. Cela casse les abstractions et rend donc la compréhension du code plus difficile.

    Je ne sais pas exactement quelle habitude de programmation mène à une conception de ce genre, mais c'est une habitude à perdre me semble-t-il.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon, eh bien tout d'abord merci à tous de vos réponses.

    J'ai essayé les diverses solutions, et ça marche. Enfin j'ai encore quelques problèmes avec la portée des variables, mais bon ce n'est pas le sujet ici.

    La solution de Tyrus me semble effectivement assez élégante, mais ce locals(), c'est quoi? je n'ai pas bien compris la syntaxe, c'est une liste, un dictionnaire?

    josmiley trouve sa solution "moins propre", pourtant je trouve qu'elle a le grand mérite d'être très explicite, en tous cas d'être très lisible. On voit bien que c'est une "fabrication" de code.

    la solution de niko77 me va bien aussi, mais l'objet n'est pas identifié de la même façon : de objet.attribut on passe à "dans la liste d'objet, l'objet toto".attribut. Je trouve ça moins proche du langage "courant".

    Enfin de toute façon, je vous remercie tous de votre aide

Discussions similaires

  1. [AC-2013] Utilisé le contenu d'une variable pour appeler des objets
    Par GuyDuLac dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/04/2013, 17h05
  2. [POO] Contenu d'une variable nom d'un objet
    Par reventlov dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2006, 17h04
  3. Réponses: 3
    Dernier message: 27/07/2005, 15h12
  4. Réponses: 11
    Dernier message: 22/06/2005, 11h04
  5. Réponses: 5
    Dernier message: 25/05/2005, 22h29

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