[Python] Approccio agli oggetti

Enrico Franchi enrico.franchi a gmail.com
Lun 8 Feb 2010 12:02:59 CET


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.




Maggiori informazioni sulla lista Python