[Python] Approccio agli oggetti

Marco Giusti marco.giusti a gmail.com
Lun 8 Feb 2010 10:29:48 CET


On Mon, Feb 08, 2010 at 09:04:05AM +0100, Diego Barrera wrote:
> Carlo C8E Miron ha scritto:
> > Seh. Mai postare prima di colazione. Rifo.
> >
> > On Sun, Feb 7, 2010 at 13:02, Carlo C8E Miron <carlo.miron a gmail.com> wrote:
> >   
> >> Ciao,
> >> prova con::
> >>
> >> 2010/2/7 Diego Barrera <diegonebarrera a 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'?

perché in realtà quando crei la classe `FilePrelievo` non puoi fare::

	self = open(filename, 'r')

perché non assegni al'istanza di `FilePrelievo` il nuovo file descriptor
ma invece fai un `rebind` della variabile self. di seguito ti scrivo una
possibile soluzione

    #!/usr/bin/python

    import sys

    class FilePrelievo(file):

        separator = ';'

        def __init__(self, fileName):
            # invoca il costruttore e quindi questa istanza
            # ha associato veramente un file descriptor ora
            super(FilePrelievo, self)__init__(fileName, 'r')
            # queste non le usi ...
            # dataSet=[]
            # linea=[]

        def leggiLinea(self):
            linea = self.readline()
            if linea:
                return map(str.strip, linea.split(self.separator))
            return linea
            # lista=linea.split(';')
            # newlista=[]
            # for x in lista:
            #     x=MyStringTool.CleanInizio(x)
            #     x=MyStringTool.CleanFine(x)
            #     newlista.append(x)
            # return newlista

        def stampa(self, stream=sys.stdout):
            print >> stream, self

    
    fp = FilePrelievo('temp')
    li = []
    while 1:
        l = fp.leggiLinea()
        if l:
            li.append(l)
        else:
            break

     fp.close()
     print li

come vedi sono molte linee in meno. python è bello per questo, in poco
ottieni tanto :)
ti conviene cercare qualche buona guida di python in linea, ne troverai
tante. quella che viene (veniva?) consigliata sempre a chi proviene da
altri linguaggi è diveintopython e in più ho visto che ne hanno scritta
una anche per python3.

comunque ti ripeto (non so' se hai ricevuto la mia precedente email) che
ti conviene usare il modulo `csv` se questo non vuole essere solo un
esercizio per imparare python.

ciao
m.

ps. il codice non è testato ma credo (leggi spero :) che funzioni


-- 
Hofstadter's Law:
It always takes longer than you expect, even when you take into account
Hofstadter's Law.


Maggiori informazioni sulla lista Python