2008/5/6 Pietro Battiston <[EMAIL PROTECTED]>: > 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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python