[Python] Re: Digest di Python, Volume 19, Numero 11

Pietro Battiston battiston a mail.dm.unipi.it
Ven 16 Nov 2007 12:54:01 CET


python-request a lists.python.it ha scritto:
>> Il problema è riprodotto nel seguente codice:
>>
>> ###################################################
>> import Tkinter
>>
>> class finestra(Tkinter.Toplevel):
>>    def __init__(self):
>>       self=Tkinter.Tk()            #Il mio oggetto instanziato lo  
>> voglio identico ad una finestra toplevel "classica"...
>>       self.stringa="testo"       #... tranne che ci voglio  
>> aggiungere i metodi e gli attributi che mi servono
>>     
>
> Forse non ti è chiaro il modo in cui funzionano gli assegnamenti in  
> python.

In realtà avevo sempre pensato che __init__ fosse una funzione "magica", 
che salvasse realmente "self" anche senza return.

> Per fare quello  
> che vuoi, devi utilizzare il __new__

Grazie mille, in effetti è proprio quello che mi serviva. Ma __new__ 
rimpiazza __init__?

Nella documentazione ufficiale 
(http://docs.python.org/ref/customization.html), sta scritto " If 
__new__() returns an instance of cls, then the new instance's __init__() 
method will be invoked"
In un'altra pagina sull'argomento 
(http://www.wellho.net/mouth/1146_-new-v-init-python-constructor-alternatives-.html), 
invece ho trovato scritto "If __new__ is defined on a class, it is 
called in preference to __init__"

Ma il seguente codice non mi conferma né l'una né l'altra ipotesi!

#####################
import Tkinter

class finestra(Tkinter.Toplevel):
     def __new__(cls):
         print "uno"
         return Tkinter.Tk()
     def __init__(self):
         print "due"
       
root=finestra()
#####################

Infatti, eseguendo il codice, stampa "due", ovvero __init__ è stata 
chiamata piuttosto che __new__...

Qualche illuminazione? (il tutorial __new__ non la nomina nemmeno...)

Pietro


P.S: Marco, non ti preoccupare, non avevo mai visto programmazione ad 
oggetti prima di incontrare Python, quindi per me è //veramente// tutto 
nuovo...


Maggiori informazioni sulla lista Python