[Python] Istanziare oggetti dinamicamente
Ciao a tutti. Ho un problema al quale non ho trovato una soluzione nonostante la ricerca on web, e riguarda la creazione di istanze di classi richiamandole attraverso variabili. Mi spiego: Ho una classe chiamata ad esempio MyClass e una MyClass2. E' possibile istanziare la classe senza "conoscerne" il nome? Cioè se ho una stringa con dentro il nome della classe, è possibile istanziare la classe usando il nome dentro la stringa? In questa maniera otterrei una automatizzazione dell'istanziazione di una classe, cosicchè cambiando il valore della stringa otterrei l'istanza della classe con il nome della stringa... Più o meno come si fa per l'import dinamico di __import__(), ma orientato all'uso con gli oggetti. Mi piacerebbe fare una cosa del genere: theClass1 = 'MyClass' theClass2 = 'MyClass2' theClass1() theClass2() Non mi piacerebbe dover inserire controlli sulla stringa riguardanti il suo contenuto, del tipo if theClass1=='MyClass': MyClass() if theClass2=='MyClass2': MyClass2() Si è capito il mio problema? Grazie Mille. -- Marco Meoni Sbaush ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Istanziare oggetti dinamicamente
Sbaush ha scritto: Ciao a tutti. Ho un problema al quale non ho trovato una soluzione nonostante la ricerca on web, e riguarda la creazione di istanze di classi richiamandole attraverso variabili. Mi spiego: Ho una classe chiamata ad esempio MyClass e una MyClass2. E' possibile istanziare la classe senza "conoscerne" il nome? Cioè se ho una stringa con dentro il nome della classe, è possibile istanziare la classe usando il nome dentro la stringa? Si. Se le definizioni delle classi sono in un unico modulo, puoi fare: theClass1 = globals()['MyClass'] Un modo più corretto di procedere è creare un registro (che può essere un semplice dizionario) in cui registri le tue classi. Ad esempio: registry = {} registry['MyClass'] = MyClass ... theClass1 = globals()['MyClass'] > [...] Saluti Manlio Perillo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Istanziare oggetti dinamicamente
Il 16/04/07, Sbaush<[EMAIL PROTECTED]> ha scritto: Ciao a tutti. Ho un problema al quale non ho trovato una soluzione nonostante la ricerca on web, e riguarda la creazione di istanze di classi richiamandole attraverso variabili. Mi spiego: Ho una classe chiamata ad esempio MyClass e una MyClass2. E' possibile istanziare la classe senza "conoscerne" il nome? Cioè se ho una stringa con dentro il nome della classe, è possibile istanziare la classe usando il nome dentro la stringa? In questa maniera otterrei una automatizzazione dell'istanziazione di una classe, cosicchè cambiando il valore della stringa otterrei l'istanza della classe con il nome della stringa... Più o meno come si fa per l'import dinamico di __import__(), ma orientato all'uso con gli oggetti. Mi piacerebbe fare una cosa del genere: theClass1 = 'MyClass' theClass2 = 'MyClass2' theClass1() theClass2() Non mi piacerebbe dover inserire controlli sulla stringa riguardanti il suo contenuto, del tipo if theClass1=='MyClass': MyClass() if theClass2=='MyClass2': MyClass2() Qualcosa tipo: class One(object): pass ... class Two(object): pass ... an_object = vars()["One"]() an_object.__class__ ? Si è capito il mio problema? Grazie Mille. Prego, ciao (c) -- Carlo C8E Miron Open Classes Solution Architect ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Istanziare oggetti dinamicamente
Intanto grazie mille per le prontissime risposte alla mia richiesta... Le vostre soluzioni funzionano entrambe se provate in terminale. Non riesco però ad applicarle al mio preciso ambito, per questo entro con voi nel merito della questione più in profondo. Ho una directory con dei plugins, che vorrei riuscire a caricare dinamicamente. Eseguo l'import dinamico cercando nel filesystem le cartelle; ogni cartella ha al suo interno un file __init__.py che dovrebbe procedere all'inclusione del file principale del plugin, che si chiama NomePlugin.py. Il codice dedito a questo è __import__(PF.pluginName, globals(), locals(), []) In PF.pluginName c'è la stringa con il nome del plugin e quindi della file .py da importare. Mi piacerebbe anche istanziare la classe principale all'interno del file, che si chiama, con un guizzo di fantasia, NomePlugin. Al momento faccio NomePlugin.NomePlugin(parametro) (supponendo appunto che sia file principale che classe si chiamino NomePlugin vorrei dinamicizzare il tutto ed ho provato con globals()[PF.pluginName](PF.pluginName) Traceback (most recent call last): File "./AirNMS.py", line 58, in ? app = AirNMS(0) File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7700, in __init__ self._BootstrapApp() File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7352, in _BootstrapApp return _core_.PyApp__BootstrapApp(*args, **kwargs) File "./AirNMS.py", line 53, in OnInit frame = MainView.MainView(None, -1, 'AirNMS') File "/home/sbaush/Projects/airspot/trunk/MainView.py", line 34, in __init__ sectionDirector.createAllPlugin() File "/home/sbaush/Projects/airspot/trunk/SectionDirector.py", line 71, in createAllPlugin self.sectionsReferences[eachSection].createPlugin() File "/home/sbaush/Projects/airspot/trunk/Section.py", line 51, in createPlugin self.pluginReferences[eachPlugin]=self.pluginFactory.getPlugin(self.basePath,self.name,eachPlugin) File "/home/sbaush/Projects/airspot/trunk/PluginFactory.py", line 22, in getPlugin __import__(self.basePath+'.'+self.sectionName+'.'+self.pluginName) File "/home/sbaush/Projects/airspot/trunk/sections/Monitor/MapPlugin/__init__.py", line 8, in ? globals()[PF.pluginName](MapPlugin) TypeError: 'module' object is not callable Ho provato anche con vars al posto di globals, ma il risultato è stato lo stesso... Cosa posso fare? Sono riuscito a spiegarmi? -- Marco Meoni (Sbaush) ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Istanziare oggetti dinamicamente
PF.pluginName e' il nome del modulo, quindi quando vedi : TypeError: 'module' object is not callable vuol dire che stai cercando di chiamare un modulo, non una classe, quindi, a mio parere dovresti fare una cosa del genere: module.py: class Pippo: pass >>> import module >>> getattr( globals()['module'] , 'Pippo') >>> getattr( globals()['module'] , 'Pippo')() insomma, devi chiamare la classe, non il modulo. byebye! -- -gaspa- --- - Powered by Debian GNU/Linux - -- HomePage: iogaspa.altervista.org --- -Il lunedi'dell'arrampicatore: www.lunedi.org - ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] includere file immagini (png) in GUI eseguibile (py2exe)
Ciao cari, al solito i miei subject sono kmetrici... :( Ho creato una semplicissima applicazione (funzioni in python e GUI GTK) che funziona perfettamente (?) se lanciata dall'interprete. Io lavoro in ambiente Debian/GNU Linux ma ho necessità di "passare" la mia applicazione a utenti windows, perciò ho scaricato e usato (in windows) py2exe. Creato il setup.py, lanciato il tutto e ho ottenuto la mia applicazione.exe che funziona alla grande ma... :) Nella mia app ci sono 2 immagini (file png) che vengono caricati sulla GUI. L'eseguibile però non li carica, nonostante siano stati inclusi nel setup.py. L'errore che mi da è che non riesce a trovare il file gdk-pixbuf.loaders. Ho letto in rete che copiando le cartelle /etc /lib e /share delle GTK dentro la cartella locale /dist (dove py2exe genera il suo exe) il problema veniva risolto. Ora, a me non risolve nulla (anzi, Pango fa le bizze e invece dei caratteri vedo dei quadratini...) e ho provato a cambiare i path del file gdk-pixbuf.loaders (che naturalmente non corrispondono se sposto la cartella). Qualcuno ha qualche idea? (oltre a non scrivere GUI, sono d'accordo... :). ciaoo e grazie nicgios ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] getter e setter praticamente uguali per piu' proprieta'
per sbaglio ho mandato l'email con un indirizzo diverso da quello con cui mi sono inscritto alla lista, riposto il mesaggio ciao!! ho una classe dove voglio creare alcune propieta' che pero' sono concettualmente molto simili, qualcosa di simile a: class A(object): vars = {} for p in ('foo', 'bar', 'egg'): def fget(self): return self.vars[p] def fset(self, value): if value is None: return self.vars[p] = value setattr(A, p, property(fget, fset)) pero' questo codice non funziona e cosi' sono costretto a creare una setter e una getter per ogni variabile: class A(object): vars = {} def fooSetter(self, value): if value is None: return self.vars['foo'] = value foo = property(lambda self: self.vars['foo'], fooSetter) def barSetter(self, value): if value is None: return self.vars['bar'] = value bar = property(lambda self: self.vars['bar'], barSetter) def eggSetter(self, value): if value is None: return self.vars['egg'] = value egg = property(lambda self: self.vars['egg'], eggSetter) c'e' un metodo piu' veloce per ottenere lo stesso risultato? ciao m signature.asc Description: Digital signature ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Re: getter e setter praticamente uguali per piu' proprieta'
Marco Giusti ha scritto: > per sbaglio ho mandato l'email con un indirizzo diverso da quello con > cui mi sono inscritto alla lista, riposto il mesaggio > > > ciao!! > > ho una classe dove voglio creare alcune propieta' che pero' sono > concettualmente molto simili, qualcosa di simile a: [snip] > c'e' un metodo piu' veloce per ottenere lo stesso risultato? Potresti creare una funzione che prende come primo parametro il nome della variabile da settare e poi lo usi al suo interno (tra l'altro noto che le variabili sono in realta' elementi di un dizionario, quindi e' ancora piu' semplice). a quel punto usi la funzione partial, dei functools. http://docs.python.org/lib/module-functools.html Esempio: def universal_setter(self, var_name, value): if value is None: return self.vars[var_name] = value egg = property(lambda self: self.vars['egg'], partial(universal_setter, var_name='egg') foo = property(lambda self: self.vars['foo'], partial(universal_setter, var_name='foo') functools e' nuovo nella 2.5, ma e' mostrato come "copiarlo" in python2.4. > ciao > m Ciao! Davide ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] lista......
Il problema è il seguente, io apro un file di testo in cui sono contenuti numeri in virgola mobile (float). Ovviamente nel file questi numeri sono memorizzati come stringhe. Il mio scopo è di convertire ciascuna stringa in un numero float, memorizzandoli in una lista (myList). Ovviamente in questo modo io non ho definito una lista Ma il problema è proprio questo! Come faccio a tipare myList come una lista lunga quanto numero!? input_file = open("./mapping.txt","r") numero = input_file.readlines() numero.sort() for i in range(len(numero)): myList = float(numero[i]) Grazie in anticipo e ciao a tutti ___ L'email della prossima generazione? Puoi averla con la nuova Yahoo! Mail: http://it.docs.yahoo.com/nowyoucan.html___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] lista......
On Monday 16 April 2007 23:42, fabio fossati wrote: > Ovviamente in questo modo io non ho definito una lista Ma il problema è > proprio questo! Come faccio a tipare myList come una lista lunga quanto > numero!? per esempio così lista = [] for i in range(1000) lista.append(i) >>> lista [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -- Manuele Pesenti [EMAIL PROTECTED] [EMAIL PROTECTED] http://mpesenti.polito.it ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python