Créer un objet à partir d'une chaine de caractère

Créer un objet à partir d'une chaine de caractère - Python - Programmation

Marsh Posté le 16-09-2005 à 14:17:11    

Salut,
 
j'ai une chaine de caractère qui contient le nom d'un objet que j'aimerais créer. Je pensais me démerder avec getattr pour faire quelque chose avec, mais je trouve pas :/
 

Code :
  1. class gni:
  2. def __init__(self):
  3.  print "gni"
  4. def load(self, id):
  5.  [...]
  6. class_name = "gni"


 
J'aimerais faire un truc du genre "my_object = class_name() ", et que my_object soit une instanciation de la classe gni, mais évidemment, ça marche pas trop [:petrus75]
 
 
Une idée ? [:dawa]

Reply

Marsh Posté le 16-09-2005 à 14:17:11   

Reply

Marsh Posté le 16-09-2005 à 16:48:13    

multani a écrit :

Salut,
 
j'ai une chaine de caractère qui contient le nom d'un objet que j'aimerais créer. Je pensais me démerder avec getattr pour faire quelque chose avec, mais je trouve pas :/
 

Code :
  1. class gni:
  2. def __init__(self):
  3.  print "gni"
  4. def load(self, id):
  5.  [...]
  6. class_name = "gni"


 
J'aimerais faire un truc du genre "my_object = class_name() ", et que my_object soit une instanciation de la classe gni, mais évidemment, ça marche pas trop [:petrus75]
 
 
Une idée ? [:dawa]


Si possible, je mettrais toutes les classes utlisables comme ça dans un dico pour commencer. Si ce n'est pas possible, il faut savoir ou se trouve définie la classe. Si c'est dans les variables globales du module en cours tu peux faire ça :
globals()["gni"]()

Reply

Marsh Posté le 16-09-2005 à 16:55:44    

multani a écrit :

Salut,
 
j'ai une chaine de caractère qui contient le nom d'un objet que j'aimerais créer. Je pensais me démerder avec getattr pour faire quelque chose avec, mais je trouve pas :/
 

Code :
  1. class gni:
  2. def __init__(self):
  3.  print "gni"
  4. def load(self, id):
  5.  [...]
  6. class_name = "gni"


 
J'aimerais faire un truc du genre "my_object = class_name() ", et que my_object soit une instanciation de la classe gni, mais évidemment, ça marche pas trop [:petrus75]
 
 
Une idée ? [:dawa]


T'as le choix entre "exec()" qui exécute une instruction Python complète et "eval()" qui évalue une expression :o

>>> class MyClass(object): pass
>>> exec("a = MyClass()" )
>>> a
<__main__.MyClass object at 0x00E31B90>
>>> b = eval("MyClass()" )
>>> b
<__main__.MyClass object at 0x00E31B90>


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-09-2005 à 16:56:32    

Kristoph a écrit :

Si ce n'est pas possible, il faut savoir ou se trouve définie la classe. Si c'est dans les variables globales du module en cours tu peux faire ça :
globals()["gni"]()


Les classes que je veux instancier ne sont pas dans le même module ... :/
 

Kristoph a écrit :

Si possible, je mettrais toutes les classes utlisables comme ça dans un dico pour commencer.


Par contre, ca c'est possible. Je crois voir le truc avec le dico :) :


class gni:
    def __init__(self):
        print "gni"
 
    def load(self, id):
         [...]
 
dico = dict()
dico["gni"] = gni()
 
class_name = "gni"
 
my_object = dico[class_name]


 
Par contre, l'instanciation de l'objet dans ce cas ce fait quand ? A la déclaration du dico normalement :??:
 
Si j'instancie plusieurs objets de la même classe à partir de ce truc, ça va me donner quoi ?

Reply

Marsh Posté le 16-09-2005 à 16:58:43    

masklinn a écrit :

T'as le choix entre "exec()" qui exécute une instruction Python complète et "eval()" qui évalue une expression :o

>>> class MyClass(object): pass
>>> exec("a = MyClass()" )
>>> a
<__main__.MyClass object at 0x00E31B90>
>>> b = eval("MyClass()" )
>>> b
<__main__.MyClass object at 0x00E31B90>



 
Ah ouais, pas con [:petrus75]

Reply

Marsh Posté le 16-09-2005 à 17:08:47    

masklinn a écrit :

T'as le choix entre "exec()" qui exécute une instruction Python complète et "eval()" qui évalue une expression :o

>>> class MyClass(object): pass
>>> exec("a = MyClass()" )
>>> a
<__main__.MyClass object at 0x00E31B90>
>>> b = eval("MyClass()" )
>>> b
<__main__.MyClass object at 0x00E31B90>



Beurk, exec et eval :o

multani a écrit :

Les classes que je veux instancier ne sont pas dans le même module ... :/
 
 
Par contre, ca c'est possible. Je crois voir le truc avec le dico :) :


class gni:
    def __init__(self):
        print "gni"
 
    def load(self, id):
         [...]
 
dico = dict()
dico["gni"] = gni()
 
class_name = "gni"
 
my_object = dico[class_name]


 
Par contre, l'instanciation de l'objet dans ce cas ce fait quand ? A la déclaration du dico normalement :??:
 
Si j'instancie plusieurs objets de la même classe à partir de ce truc, ça va me donner quoi ?


En Python, une classe est un objet qu'on peut évaluer t qui renvoye un objet instance du premier :) La construction des instances se fait au moment ou tu execute l'object classe comme tu executerais un appel de fonction :
gni()
 
En fait, le but ici était de mettre l'objet classe dans le dico pour l'executer plus tard :

class gni:
    def __init__(self):
        print "gni"
 
    def load(self, id):
         [...]
 
dico = dict()
dico["gni"] = gni
 
class_name = "gni"
 
my_object = dico[class_name]()


Reply

Marsh Posté le 16-09-2005 à 17:18:34    

Hum, pas con aussi [:petrus75] (décidément, spas ma journée aujourd'hui :o )
 
Allez, c'est parti pour le dico [:dawa]

Reply

Marsh Posté le 16-09-2005 à 17:29:40    

Kristoph a écrit :

Beurk, exec et eval :o


C'est très bien exec et eval quand on en abuse pas [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-09-2005 à 17:36:41    

masklinn a écrit :

C'est très bien exec et eval quand on en abuse pas [:petrus75]


Les cas d'usage légitimes ne sont pas courants [:petrus75]

Reply

Marsh Posté le 25-03-2006 à 13:42:49    

Bonjour j'ai un peu le meme probleme, que je n'arrive pas à résoudre
J'ai une méthode qui se charge de lire un repertoire et d'ajouter le nom de tous les fichiers python dans une liste  sous forme d'une chaine (une classes par fichier).
Mon but est de créer un objet pour chaque fichier récupéré. Avez vous une solution parce que je ne trouve pas de documentation claire pour un débutant (y compris dive into python...)
Merci pour vos réponses

Reply

Marsh Posté le 25-03-2006 à 13:42:49   

Reply

Marsh Posté le 25-03-2006 à 14:41:16    

Ben la solution proposé par Kristoph ne convient pas :??:
 
En gros, tu charges tes fichiers dans  ta liste, et si tu fais un truc du genre  

Code :
  1. obj = liste_fichiers[0]()

?

Reply

Marsh Posté le 25-03-2006 à 19:49:37    

si merci, désolé j'avais pas compris ca comme ca
j suis un peu teub :pt1cable:  

Reply

Marsh Posté le 28-03-2006 à 10:24:26    

Moi en essayant ce code :
 

Code :
  1. file = []
  2. file.append("MaClasse" )
  3. obj = file[0]()


 
ca me met

Code :
  1. obj = file[0]()
  2. TypeError: 'str' object is not callable


 
 :??:


Message édité par boumbomagik le 28-03-2006 à 10:24:58
Reply

Marsh Posté le 28-03-2006 à 10:31:50    

Normal, tu essaie d'appeller "MaClasse"(), faut faire ça plutôt :

Code :
  1. file = []
  2. file.append(MaClasse) # Pas une chaine de caractère
  3. obj = file[0]


Message édité par multani le 28-03-2006 à 10:32:36
Reply

Marsh Posté le 28-03-2006 à 10:34:41    

oui mais dans le premier message de niark22 il est question de chaine de caractere dans une liste et apres on instancie

Reply

Marsh Posté le 28-03-2006 à 10:39:11    

Ben faut passer par un dict alors.
Tu charges le nom des fichiers en tant que clé de ton dictionnaire. En valeur, tu mets une référence vers ta classe, et tu fais des file["MaClasse"]()

Reply

Marsh Posté le 28-03-2006 à 11:03:38    

multani a écrit :

Ben faut passer par un dict alors.
Tu charges le nom des fichiers en tant que clé de ton dictionnaire. En valeur, tu mets une référence vers ta classe, et tu fais des file["MaClasse"]()


une reference comment ca?  

Reply

Marsh Posté le 28-03-2006 à 11:06:32    

Tu mets MaClasse tout simplement.

Reply

Marsh Posté le 28-03-2006 à 11:15:12    

le probleme, c'est que je ne connais pas MaClasse, j'ai juste le nom du fichier python tout comme niark... je peut donc pas donner de reference? a moins que je sois définitivement idiot :pt1cable:  
 
en tout cas merci d'etre aussi patient :hello:

Reply

Marsh Posté le 28-03-2006 à 11:34:28    

Ah, ben après, c'est une autre histoire.
 
Il faut charger le module qui correspond à ton fichier, puis que charges la classe à partir de ce module, un truc du genre je pense :

Code :
  1. for file in list_files:
  2.    my_module = __import__('file')
  3.    my_class = getattr(my_module, 'file')


 
Et après, tu as ta classe my_class, que tu peux instancier comme d'habitude : obj = my_class()

Reply

Marsh Posté le 01-04-2006 à 02:18:22    

ok merci bien, j'ai pas encore essayé mais des lundi j'y fonce :bounce:

 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed