#1 Le 14/06/2012, à 11:14
- PengouinPdt
python, fichier glade, et __getitem__
Bonjour...
Je m'essaye à python, à la gestion de fichier glade...
Je souhaiterai savoir s'il est possible d'appeler les items par self.nomItem, au lieu de self['nomItem'].
De ce que j'ai compris, par l'usage de la méthode __getitem__, tel que :
def __getitem__(self, key):
#return self.gui.get_widget(key) # libglade
return self.gui.get_object(key) # gtkbuilder
je peux ensuite appeler mes items par self['idItem'] ... c'est bien, soit. (ou 'idItem' est le nom donné à l'object dans le fichier glade).
Mais j'aimerais plutôt pouvoir les appeler par self.idItem, est-ce possible, certainement, mais je comprends pas comment faire ?!
En espérant avoir été clair
Dernière modification par PengouinPdt (Le 14/06/2012, à 11:15)
Hors ligne
#2 Le 14/06/2012, à 11:40
- Jules Petibidon
Re : python, fichier glade, et __getitem__
Tu peux utliser la méthode __getattr__, genre ça :
class B(object):
def __init__(self):
self.values = {'a':5,'b':6,'c':7}
def __getattr__(self, key):
return self.values.get(key, 0)
b = B()
b.c
7
b.d
0
Je sais pas si c'est un super conseil que je te donne en même temps...
Hors ligne
#4 Le 14/06/2012, à 15:58
- Jules Petibidon
Re : python, fichier glade, et __getitem__
Un peu plus d'informations sur le problème rencontré ?
Hors ligne
#5 Le 14/06/2012, à 22:06
- PengouinPdt
Re : python, fichier glade, et __getitem__
beh, justement, j'ai donné les informations que j'ai.
Je souhaite créer les variables dynamiques à partir des id des objects contenus dans le fichier glade.
Si :
def __getitem__(self, key):
#return self.gui.get_widget(key) # libglade
return self.gui.get_object(key) # gtkbuilder
Me permet d'utiliser le code suivant : self['idItem']
Si je veux utiliser, en lieu et place, self.idItem, il me faut faire pour chaque objet :
self.idItem = self['idItem']
Sauf que les objects se multipliant dans un fichier glade, s'il y en a dix, il me faut créer dix fois la variable correspondante.
Bref, autant d'object, y'a-t-il, autant de variables, je me dois d'écrire.
Il y a certainement moyen de les créer dynamiquement, du style 'self.idItem' ;-)
Hors ligne
#6 Le 15/06/2012, à 07:38
- Keldath
Re : python, fichier glade, et __getitem__
Salut,
Pourtant, la réponse de Jules semble adéquate, c'est __getattr__ qu'il te faut utiliser. Seulement, l'appel à cette "magic method" ne se fera seulement si l'attribut recherché n'existe pas dans __dict__ :
class B(object):
def __init__(self):
self.a = "Foo"
self.values = {'a':5,'b':6,'c':7}
def __getattr__(self, key):
return self.values.get(key, 0)
b = B()
b.a
'Foo'
b.c
7
b.d
0
Quelle version de Python utilises-tu ?
Hors ligne
#7 Le 15/06/2012, à 09:50
- PengouinPdt
Re : python, fichier glade, et __getitem__
Salut,
Pourtant, la réponse de Jules semble adéquate, c'est __getattr__ qu'il te faut utiliser. Seulement, l'appel à cette "magic method" ne se fera seulement si l'attribut recherché n'existe pas dans __dict__ :
class B(object): def __init__(self): self.a = "Foo" self.values = {'a':5,'b':6,'c':7} def __getattr__(self, key): return self.values.get(key, 0) b = B() b.a 'Foo' b.c 7 b.d 0
Le code, là, je le comprends ... sauf que là tu gères l'appel à tes variables en étant extérieur à ta classe.
Tu crées un objet 'b' et tu lui attribues les variables a, c, ou d...
Moi, je suis dans la classe ... et mon appel est interne.
Donc, je ne peux pas faire :
def __getattr(self, key) :
return self.self.get(key, 0)
puisque la méthode spéciale __getitem__, tel que présenté dans le premier post, me retourne des objects 'self['idItem']', qui appartiennent à mon premier objet nommé 'gui' ...
Quelle version de Python utilises-tu ?
Celle, en cours, sur U 12.04 LTS : à savoir 2.7.3 ;-)
Dernière modification par PengouinPdt (Le 15/06/2012, à 10:05)
Hors ligne
#8 Le 15/06/2012, à 10:11
- PengouinPdt
Re : python, fichier glade, et __getitem__
C'est bon !!!
J'ai trouvé et c'est vraiment tout couillon :
def __getattr__(self, key):
return self.gui.get_object(key)
Cela me permet d'appeler mes objects, directement par 'self.idItem' où idItem est l'id donné à l'objet enfant ...
et, non plus par 'self['idItem']' ...
Merci à vous deux de m'avoir mis sur la piste
++
Hors ligne