[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