<[EMAIL PROTECTED]> <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> Message-ID: <[EMAIL PROTECTED]> X-Sender: [EMAIL PROTECTED] Received: from i-195-137-118-176.freedom2surf.net [195.137.118.176] with HTTP/1.1 (POST); Tue, 06 May 2008 17:14:31 +0200 User-Agent: RoundCube Webmail/0.1 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit
On Tue, 06 May 2008 14:32:49 +0200, Pietro Battiston <[EMAIL PROTECTED]> wrote: > Francesco Guerrieri ha scritto: >> On Mon, May 5, 2008 at 9:20 AM, Pietro Battiston <[EMAIL PROTECTED]> > wrote: >> >>> Pietro Battiston ha scritto: >>> "delegare" significa in pratica "richiamare esplicitamente il metodo > di >>> libreria all'interno del metodo che si ridefinisce"? Tipo >>> >>> class nonderivata(): >>> def __fai_questo__(self): >>> set.__fai_questo__(self) >>> >>> ? >>> >>> Se sì, che ci guadagno?! >>> Se no, che vuol dire?! Si', e' questo. >> Ciao, spero di non aggiungere confusione. Se fosse così, cancellate >> il mio messaggio :) Non si puo': hai detto una cosa sbagliata: va detto :) >> Ho letto rapidamente il thread, forse un semplice esempio può essere > utile: >> >> >>>>> class my_list(list): >>>>> >> ... def append(self, val): >> ... print "ciao", val >> ... list.append(self, val) >> ... Questa non e' una delega ma e' un'estensione per sottoclasse. No, non e' uguale. Estendendo per sottoclasse puoi solo aggiungere metodi, non rimuoverli ne' cambiarne la signature. La distinzione fondamentale e' che un'istanza di sottoclasse "e' una" istanza della classe di base. Ovunque un'istanza della classe di base e' accettato, deve esserlo anche una della sottoclasse (principio di sostituzione di Liskov). Questo vale anche in linguaggi staticamente tipati, non solo in Python (dove il duck typing permette di passare argomenti di qualunque classe purche' offrano i metodi attesi). Se B delega A (anziche' subclassarla) allora l'istanza di B "ha una" istanza di A. Usando la delega hai maggiore liberta': puoi definire un'interfaccia del tutto diversa (non solo il caso banale in cui hai un mapping 1-1 dei metodi deleganti su quelli delegati). Puoi cambiare signature e semantica dei metodi a cuor contento e puoi rimuovere metodi semplicemente non delegadoli. >> ... >> Come vedi my_list eredita da list, a cui delega tutti i metodi, >> ad esempio __repr__ e reverse, e invece sovrascrive, >> in una maniera veramente stupida, il metodo append. Non li hai delegati: la richiesta e' andata direttamente alla classe di base. Non sempre vuoi questo. Ciao! -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python