[Python] Dubbi su hash e set

Daniele Varrazzo piro a develer.com
Mar 6 Maggio 2008 17:14:31 CEST


<481EB542.6060403 a email.it>
<79b79e730805060404u4ad32387h98459a36d21e9065 a mail.gmail.com> <48204FF1.1010702 a email.it>
Message-ID: <8f8406b4414372ea64c83d487d0be860 a develer.com>
X-Sender: piro a develer.com
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 <toobaz a email.it>
wrote:
> Francesco Guerrieri ha scritto:
>> On Mon, May 5, 2008 at 9:20 AM, Pietro Battiston <toobaz a email.it>
> 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



Maggiori informazioni sulla lista Python