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