[Python] domanda sulle classi
ho iniziato per motivi di lavoro con python a fare un modulo/classe di connessione ed operazioni al database, chiamandolo così Database.py il punto della questione nasce quando poi volevo fare un file esempi.py, nel quale importavo (in teoria) siccome vengo da programmazione java, sono quindi abituato alla logica usata per essa ho fatto una classe banale python class Pippo: __col='' __nul='' __typ='' def __init__(self): self.__col='1' self.__nul='2' self.__typ='3' def setColumn(self,name): self.__col=name def setNull(self,nullo): self.__nul=nullo def setType(self,type): self.__typo=type def getColumn(self): return self.__col def getNull(self): return self.__nul def getType(self): return self.__typ e qui sotto l'esempio creato tramite la modalità interattiva di pythonwin import Pippo a=Pippo() Traceback (most recent call last): File "", line 1, in ? TypeError: 'module' object is not callable la domanda di conseguenza viene spontanea, cioè perchè ho sempre questo errore quando provo ad "istanziare" una classe ad una variabile? ciau a tutta la ml ;) ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] domanda sulle classi
On Wed, Nov 15, 2006 at 11:49:53AM +0100, judge judge wrote: > ho iniziato per motivi di lavoro con python a fare un modulo/classe di > connessione ed operazioni al database, chiamandolo così Database.py > il punto della questione nasce quando poi volevo fare un file > esempi.py, nel quale importavo (in teoria) > siccome vengo da programmazione java, sono quindi abituato alla logica > usata per essa > ho fatto una classe banale python > > class Pippo: > __col='' ... > >>>import Pippo > >>>a=Pippo() > Traceback (most recent call last): > File "", line 1, in ? > TypeError: 'module' object is not callable > > la domanda di conseguenza viene spontanea, cioè perchè ho sempre > questo errore quando provo ad "istanziare" una classe ad una > variabile? ma in che file hai definito la classe Pippo, in Database.py? se è così, da esempio.py scrivi: import Database a = Database.Pippo() *:-) -- Sandro Dentella *:-) http://www.tksql.orgTkSQL Home page - My GPL work ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] domanda sulle classi
Alle 11:49, mercoledì 15 novembre 2006, judge judge ha scritto: Ciao! Mi permetto di darti qualche consiglio :) > class Pippo: > __col='' > __nul='' > __typ='' Penso tu stia utilizzando il __ per rendere un nome privato, giusto? In questo caso utilizza il singolo _ al posto del doppio. Il __ non rende un nome privato nel senso di Java: viene effettuato un name mangling in modo da aggiungere il nome della classe a quel nome. Quindi e` comunque possibile accedere a 'col', 'nul', typ' solo che per farlo si dovra` utilizzare: Pippo._Pippo__col Pippo._Pippo__nul e cosi` via :) Quindi se stai utilizzando il __ per il private del Java, cambialo un un _: il _ rappresenta la *convenzione* che specifica ad un altro developer che quel nome e` da intendersi come dettaglio implementativo e quindi non va utilizzato. I nomi preceduti da _ non vengono importati con un "from miomodulo import *". Il __ e` nato per risolvere un differente problema. Se ho le seguenti classi: class Foo(object): def m1(self): self.x = 1 def m2(self): print self.x class Bar(object): def ma(self): self.x = 0 def mb(self): print self.x class FooBar(Foo, Bar): pass Un'istanza di FooBar si ritrovera` con un attributo x il cui valore dipende dall'ultima classe lo ha assegnato. Nella pratica: >>> v = FooBar() >>> v.m1() >>> v.m2() 1 Se adesso chiamassi il metodo mb della classe Bar: >>> v.mb() 1 Analogamente: >>> v.ma() >>> v.mb() 0 >>> v.m2() 0 Questo avviene perche` tutti gli assegnamenti a self.x referenziano sempre la stessa istanza (v) indifferentemente da quale classe utilizzi tale nome: esiste un solo attributo x nell'istanza v! Per evitare tale problema si ricorre al __: class Foo(object): def m1(self): self.__x = 1 def m2(self): print self.__x class Bar(object): def ma(self): self.__x = 0 def mb(self): print self.__x class FooBar(Foo, Bar): pass Infatti: >>> v = FooBar() >>> v.m1() >>> v.ma() >>> v.m2() 1 >>> v.mb() 0 > def setColumn(self,name): > self.__col=name > [...] > def getColumn(self): > return self.__col Non hai bisogno di utilizzare getter e setter, Python ha le property (le puoi usare solo per le classi new style) ;) Trovi un esempio qui (la funzione property): http://docs.python.org/lib/built-in-funcs.html Ciao! -- Eriol - *p = NULL; - EIBTI GPG Key ID 297BE0CA ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python