[Python] Dubbi su hash e set

enrico franchi enrico.franchi a gmail.com
Lun 5 Maggio 2008 11:51:06 CEST


On Mon, May 5, 2008 at 9:20 AM, Pietro Battiston <toobaz a email.it> wrote:
> Pietro Battiston ha scritto:
>  > enrico franchi ha scritto:
>
>
> >> On Sun, May 4, 2008 at 7:20 PM, Pietro Battiston <toobaz a email.it> wrote:
>  >>
>  >>
>  >>>  (O intendi qualcos'altro? Io per ora del tipo "set" sto usando update,
>  >>>  remove, add, metodi che non vorrei dover ridefinire)
>  >>>
>  >>
>  >> E non ridefinirli. Delegali.
>
>  Vabbé che "Google is my friend", ma certo sei un tantinello criptico
>  (immagino si evinca dai miei messaggi precedenti quanto io sia poco
>  esperto di Python)?

Non è questione di esperienza di Python. E' una tecnica iper-standard
di programmazione agli oggetti.
Tipicamente quando progetti una qualunque gerarchia di classi una
delle prime domande che ti devi porre è se usare ereditarietà o
composizione (tipicamente l'ereditarietà è spesso usata a sproposito).
Quando usi composizione spesso fai anche delega (specie nei casi in
cui eri in lizza con l'ereditarietà pubblica).

>  "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?!

Kind of. In effetti *non* è come dici, ma ci vai vicino. Il caso base sarebbe

class my_obj(object):
  def __init__(self):
    self.contents = set()

  def foo(self):
    return self.contents.foo()

Ovviamente visto che Python è un linguaggio dinamico non hai necessità
di farlo veramente ma puoi semplicemente scrivere il codice per
generare questo codice per i metodi di interesse.

Cosa ci guadagni? E' la solita banale fra "is a" e "has a". Quando usi
ereditarietà per modellare una relazione di has-a, stai chiedendo
guai. Comunque non credo sia il caso di fare qui un mini-corso di
fondamenti di progettazione ad oggetti  e non conosco risorse
direttamente in Python per farlo.

Potrei indicarti alcuni articoli di Martins

http://www.objectmentor.com/resources/articles/lsp.pdf

e già che ci siamo:

http://www.objectmentor.com/resources/articles/ocp.pdf


-- 
-enrico


Maggiori informazioni sulla lista Python