[Python] Dubbi su hash e set
Francesco Guerrieri
f.guerrieri a gmail.com
Mar 6 Maggio 2008 15:31:12 CEST
2008/5/6 Pietro Battiston <toobaz a email.it>:
> Francesco Guerrieri ha scritto:
> Purtroppo questo non mi schiarisce affatto le idee, perché questo
> "delegare" era più o meno quello che facevo io (ereditare i metodi
> implicitamente, quando vanno bene quelli di libreria), ma dalle email di
> Enrico mi ero convinto che delegare volesse dire un'altra cosa (che lui
> mi consiglia di fare, ma di cui non ho ancora afferrato i vantaggi), e
> cioé, se ho capito bene, "esplicitare" questo utilizzo dei metodi di
> libreria tramite la non-ereditarietà, qualcosa come, riprendendo il tuo
> esempio:
>
> class my_list():
> def __init__(self):
> self.campo_lista=list()
> def append(self, val):
> self.campo_lista.append(val)
>
> Ora io non voglio tediare la lista con cose che saranno note a tutti
> coloro che vivono di programmazione ad oggetti, ma se ci fosse un link
> in cui trovare cosa significa esattamente delegare ma soprattutto perché
> mi converrebbe, questo esaurirebbe i miei dubbi.
Pietro, non ti preoccupare di "tediare la lista". Se hai dei dubbi fai
bene a fare delle domande!
Dopo questa perla di saggezza, ne aggiungerò un'altra: la rapidità di
sviluppo di Python (e il duck typing)
ti permette di cambiare qualche elemento del tuo design "in corsa".
Basta mantenere invariati i nomi dei metodi...
Quindi potresti provare con il tuo approccio e se scoprirai, usandolo,
che ti fa scrivere del codice
troppo "macchinoso"... allora sarà giunto il momento di cambiarlo :)
Nel tuo esempio stai delegando all'oggetto campo_lista solamente il
metodo append:
tutti gli altri naturalmente non sono delegati.
Questo potrebbe essere quello che vuoi.
Altrimenti devi usare i metodi speciali, come __getattr__.
Provo ad allegare un esempio rapidissimo e stupido (spero che almeno
sia corretto :) )
class Delegator(object):
def __init__(self, val):
self.a = list(val)
def __getattr__(self, name):
print "Stai delegando il metodo", name
return getattr(self.a, name)
if __name__ == '__main__':
prova = Delegator([1,3,2])
print prova.a
prova.sort()
print prova.a
print prova.index(3)
prova.a[2]
Nota che la classe è di tipo new-style, non usare lo stile old (cioè
metti object come classe base).
ciao,
Francesco
Maggiori informazioni sulla lista
Python