Re: [Python] Approccio agli oggetti
Grazie a tutti, i vostri consigli mi sono stati molto utili.. quindi vi posto il nuovo codice.. :) code #!/usr/bin/python import os, myStringTool class FilePrelievo(file): def __init__(self,FileName): self.myfile = open(FileName,'r') self.dataSet=[] self.linea=[] def leggiLinea(self): linea=self.myfile.readline() l=linea.split(';') newlista=[] for x in l: x=myStringTool.cleanInizio(x) x=myStringTool.cleanFine(x) newlista.append(x) return newlista def importaFile(self): while self.linea['']: self.linea=self.leggiLinea() self.dataSet.append(self.linea) if self.dataSet[-1]==['']: self.dataSet=self.dataSet[:-1] def stampa(self,myfile): print myfile,--- for i in range(len(self.dataSet)): print myfile,! %s ! %s ! %s ! %s ! %s ! % \ (myStringTool.optString(self.dataSet[i][0],12),\ myStringTool.optString(self.dataSet[i][1],5),\ myStringTool.optString(self.dataSet[i][2],12),\ myStringTool.optString(self.dataSet[i][3],12),\ myStringTool.optString(self.dataSet[i][4],2)) print myfile, --- prelievo=FilePrelievo('/home/diego/Scrivania/IndirizziCIP.csv') prelievo.importaFile() myfile=open('/home/diego/Scrivania/IndirizziCIP2.csv','w') prelievo.stampa(myfile) myfile.close myfile=open('/home/diego/Scrivania/IndirizziCIP2.csv','r') printer=os.popen('lpr','w') printer.write(myfile.read()) \code invece dentro myStringTool: code def cleanInizio(mystring): if mystring=='': return mystring if (mystring[0]==' ') : mystring = cleanInizio(mystring[1:]) return mystring else: return mystring def cleanFine(mystring): if mystring=='': return mystring if (mystring[-1]==' ') or (mystring[-1]=='\n') : mystring = cleanFine(mystring[:-1]) return mystring else: return mystring def optString(stringa, lunghezza): blank=' ' * lunghezza stringa= (stringa + blank) [0:lunghezza] return stringa \code Ciao a tutti ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
Carlo C8E Miron ha scritto: Seh. Mai postare prima di colazione. Rifo. On Sun, Feb 7, 2010 at 13:02, Carlo C8E Miron carlo.mi...@gmail.com wrote: Ciao, prova con:: 2010/2/7 Diego Barrera diegonebarr...@yahoo.it: code #!/usr/bin/python class FilePrelievo(file): def __init__(self,fileName): self.file=open(fileName,'r') ^ il typo era qui!!1 [cut] Non ho capito perche' devo fare cosi'.. la mia classe FilePrelievo eredita gli attributi e i metodi della classe file, inoltre ha i vari attributi che definisco in __init__ Quando poi definisco il metodo leggiLinea, passo come argomento proprio self.. ma self.readline() chiamato da leggiLinea, non punta al file gia' aperto.. perche'? Grazie, ciao diego ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
Marco Giusti spiffera, alle Monday 08 February 2010 circa: ps. il codice non è testato ma credo (leggi spero :) che funzioni - super(FilePrelievo, self)__init__(fileName, 'r') + super(FilePrelievo, self).__init__(fileName, 'r') ciao ;) -- -gaspa- --- https://launchpad.net/~gaspa - - HomePage: http://gaspa.yattaweb.it -- -Il lunedi'dell'arrampicatore: www.lunedi.org - ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
On Feb 8, 2010, at 9:04 AM, Diego Barrera wrote: Non ho capito perche' devo fare cosi'.. Perche' quello che hai scritto tu non fa quello che tu pensi di avere scritto. :) la mia classe FilePrelievo eredita gli attributi e i metodi della classe file, inoltre ha i vari attributi che definisco in __init__ Provando la tua classe, ti sarai anche accorto che tu in __init__ *non* definivi attributi ma solo variabili locali. Che immagino non fosse quello che volevi. Quando poi definisco il metodo leggiLinea, passo come argomento proprio self.. ma self.readline() chiamato da leggiLinea, non punta al file gia' aperto.. perche'? Vuoi il mio consiglio? Abbandona questo design. Ereditare da qualcosa e' introdurre una relazione *molto* forte. E io, sinceramente, non ne vedo il bisogno in questo caso. La composizione e' decisamente piu' facile da gestire. Quando erediti, devi conoscere in generale dettagli sulla classe da cui erediti. Ovvero, la classe da cui erediti deve essere essenzialmente pensata per essere sottoclassata. In Python probabilmente non si vede troppo la distinzione, ma in linguaggi come C++ questa cosa porta a bachi anche abbastanza evidenti o ad errori di compilazione (in Java). Il problema e'... sei consapevole che se uno usa il tuo FilePrelievo come se fosse un file (ed e' una cosa *assolutamente* legittima, visto che tu hai asserito che e' proprio un file) non usa le funzioni che tu avresti voluto aggiungere? Quindi hai chiesto che FilePrelievo sia un file, ma e' abbastanza ovvio che tu non pianifichi di usarlo come un file. Il metodo stampa poi e' pessimo: davvero poco generale e oltretutto non fa nemmeno la cosa giusta. In Python ti consiglio di definire __str__ in modo che ti restituisca una rappresentazione human-readable del tuo oggetto in forma di stringa. A margine non mi viene in mente nessuna rappresentazione human readable buona di un oggetto che rappresenta un file, quindi forse vuoi ridefinire __repr__... boh, questo e' quello che fa Python: print f open file 'log.txt', mode 'r' at 0x1012c2ad0 Il motivo per cui stampa e' pessima e' che di fatto non fa nulla di utile. Se f.stampa() fa *esattamente* print f, allora lascia print f e amen. Almeno e' piu' generale nel senso che puoi scegliere dove stampare. Entrando poi nel merito di MyStringTool: 1. eredita da object, please 2. non funziona come vuoi... i suoi metodi non hanno senso come metodi e tu li chiami sull'oggetto classe, non sull'istanza dell'oggetto. Entrandoci dentro, il codice non funge... cose come mystring = CleanFine(mystring[:-1]) non hanno senso, a meno che tu non abbia definito altrove CleanFine. In definitiva ti consiglio *davvero* di studiare su un qualunque manuale. Almeno avresti codice in cui la semantica di quello che intendi corrisponde con quella di Python. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
Enrico Franchi ha scritto: Vuoi il mio consiglio? Abbandona questo design. Ereditare da qualcosa e' introdurre una relazione *molto* forte. E io, sinceramente, non ne vedo il bisogno in questo caso. Ok Il metodo stampa poi e' pessimo: davvero poco generale e oltretutto non fa In realta' stampa era solo un test... ma doveva stampare la lista... l'ho incollato per errore Entrando poi nel merito di MyStringTool: 1. eredita da object, please 2. non funziona come vuoi... i suoi metodi non hanno senso come metodi e tu li chiami sull'oggetto classe, non sull'istanza dell'oggetto. Entrandoci dentro, il codice non funge... cose come mystring = CleanFine(mystring[:-1]) non hanno senso, a meno che tu non abbia definito altrove CleanFine. In definitiva ti consiglio *davvero* di studiare su un qualunque manuale. Almeno avresti codice in cui la semantica di quello che intendi corrisponde con quella di Python. In realta' mi sono studiato quasi tutto il manuale di Learning Python.. e le cose che voglio fare le so fare utilizzando la programmazione classica, pero' vorrei imparare la programmazione ad oggetti.. forse confondo un po' le funzioni con gli oggetti. Comunque grazie mille, mi rimetto a provare sti benedetti oggetti :) Ciao diego ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
2010/2/8 Diego Barrera diegonebarr...@yahoo.it .. forse confondo un po' le funzioni con gli oggetti. Ti puó aiutare pensare che un oggetto è come una struttura dati personalizzata, qualcosa al livello delle liste, stringhe, tuple, dizionari... In effetti tutte queste cose in python sono oggetti, con metodi e proprietá ben definiti. Comunque grazie mille, mi rimetto a provare sti benedetti oggetti :) Ciao diego ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python -- Giovanni Dall'Olio, phd student Department of Biologia Evolutiva at CEXS-UPF (Barcelona, Spain) My blog on bioinformatics: http://bioinfoblog.it ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Approccio agli oggetti
Ciao a tutti, mi sto avvicinando alla programmazione OO. Cortesemente qualcuno mi spiega perche' mi da errore la self.readline() dentro il metodo leggiLinea? Dice che il file e' chiuso.. se la readline la faccio in __init__ nessun problema.. Ecco il codice code #!/usr/bin/python class FilePrelievo(file): def __init__(self,fileName): self=open(fileName,'r') dataSet=[] linea=[] def leggiLinea(self): linea=self.readline() lista=linea.split(';') newlista=[] for x in lista: x=MyStringTool.CleanInizio(x) x=MyStringTool.CleanFine(x) newlista.append(x) return newlista def stampa(self): print self class MyStringTool: def CleanInizio(self,mystring): if (mystring[0]==' ') : mystring = CleanInizio(mystring[1:]) return mystring else: return mystring def CleanFine(self,mystring): if (mystring[-1]==' ') or (mystring[-1]=='\n') : mystring = CleanFine(mystring[:-1]) return mystring else: return mystring prelievo=FilePrelievo('/home/diego/Scrivania/IndirizziCIP.csv') prelievo.leggiLinea() prelievo.stampa() /code ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
Ciao, prova con:: 2010/2/7 Diego Barrera diegonebarr...@yahoo.it: code #!/usr/bin/python class FilePrelievo(file): def __init__(self,fileName): file=open(fileName,'r') dataSet=[] linea=[] def leggiLinea(self): linea=self.file.readline() [snip] HTH, HAND © -- Carlo C8E Miron self.self Seems Worster Solution Architect™ ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
Seh. Mai postare prima di colazione. Rifo. On Sun, Feb 7, 2010 at 13:02, Carlo C8E Miron carlo.mi...@gmail.com wrote: Ciao, prova con:: 2010/2/7 Diego Barrera diegonebarr...@yahoo.it: code #!/usr/bin/python class FilePrelievo(file): def __init__(self,fileName): self.file=open(fileName,'r') ^ il typo era qui!!1 dataSet=[] linea=[] def leggiLinea(self): linea=self.file.readline() [snip] HTH, HAND © -- Carlo C8E Miron self.self Seems Worster Solution Architect™ [questo .sig e` perche` all'inizio avevo preservato il nome dell'attributo, e quindi mi era venuto fuori un curioso self.self = open(...] Sorry again, e grazie al Pelatone™ per la segnalazione © -- Carlo C8E Miron Thx Bald Bro Solution Architect™ ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Approccio agli oggetti
On Sun, Feb 07, 2010 at 12:37:40PM +0100, Diego Barrera wrote: Ciao a tutti, mi sto avvicinando alla programmazione OO. Cortesemente qualcuno mi spiega perche' mi da errore la self.readline() dentro il metodo leggiLinea? Dice che il file e' chiuso.. se la readline la faccio in __init__ nessun problema.. Ecco il codice [cut] se questo codice non ti serve per imparare python, usa il modulo csv della libreria standard, credo che lo troverai utile. -- Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python