[Python] Istanziare oggetti dinamicamente

2007-04-16 Per discussione Sbaush

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

2007-04-16 Per discussione Manlio Perillo

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

2007-04-16 Per discussione Carlo C8E Miron

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

2007-04-16 Per discussione Sbaush

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

2007-04-16 Per discussione Andrea Gasparini
 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)

2007-04-16 Per discussione Nicola Giosmin -
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'

2007-04-16 Per discussione Marco Giusti
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'

2007-04-16 Per discussione Davide Lo Re
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......

2007-04-16 Per discussione fabio fossati
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......

2007-04-16 Per discussione Manuele Pesenti
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