LinuxLudus: Pytoni e bottiglie
Daniele Zambelli
daniele.zambelli@inwind.it
Ven 20 Giu 2008 12:17:02 CEST
On Wednesday 18 June 2008 16:52:37 Valerio Pachera wrote:
> Da una guida in rete:
>
> "The first argument of every class method, including __init__, is
> always a reference to the current instance of the class. By
> convention, this argument is always named self. In the __init__
> method, self refers to the newly created object; in other class
> methods, it refers to the instance whose method was called. "
>
> Sinceramente mi sfugge la sfumatura menzionata nell'utlima frase: che
> differenza c'è fra il self del metodo __init__ rispetto agli altri
> metodi?
Iniziamo dal significato che ha negli altri metodi:
>>> class Prova(object):
def __init__(self, n):
self.numero=n
def stampa(self):
print self.numero
Il primo parametro di ogni metodo è "self".
Ora possiamo costruire due oggetti di questa classe:
>>> p0=Prova(5)
>>> p1=Prova(8)
Poi possiamo usare questi due metodi:
>>> p0.stampa()
5
>>> p1.stampa()
8
Queste due istruzioni potrebbero anche essere realizzate chiamando il metodo
stampa della classe Prova passando esplicitamente il riferimento all'oggetto:
>>> Prova.stampa(p0)
5
>>> Prova.stampa(p1)
8
quindi:
p0.stampa()
è semplicemente un modo diverso, e più comodo, per dire:
Prova.stampa(p0)
La funzione stampa della classe Prova la prima volta ha lavorato sui dati
dell'oggetto p0 la seconda volta sui dati dell'oggetto p1.
Ora veniamo alla differenza con il metodo __init__.
In questo caso l'istruzione:
>>> p2=Prova(7)
Non può essere tradotta in qualcosa del genere:
>>> Prova.__init__(p2, 7)
infatti si ottiene:
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
Prova.__init__(p2, 7)
NameError: name 'p2' is not defined
Nel metodo __init__, self non viene passato alla funzione, ma il metodo
costruisce un oggetto di questa classe e poi lo lega alla parola self. In
seguito l'istruzione self.numero=n lega alla parola numero dell'oggetto in
costruzione il numero collegato a n. E alla fine __init__ dà come risultato
l'oggetto che può essere legato ad una parola come nell'istruzione:
>>> p2=Prova(7)
o può essere inserito in una lista come nell'istruzione:
>>> l=[Prova(7), Prova(9)]
o se ne può fare quello che si vuole.
Si vede quindi che nel metodo __init__ il parametro self ha un significato un
po' diverso da quello che ha negli altri metodi.
*Io l'ho capita così. Però non ci scommetterei qualcosa a cui sono
affezionato...*
Scusate la lunga digressione, ma non riuscivo a dirlo con meno parole.
Spero di essere riuscito a spiegarmi.
Ciao
--
Daniele www.fugamatematica.blogspot.com
giusto!
_o) (o_ (o_ _o) nel verso
-./\\ //\.- //\ /\\ forse è perché non guardiamo le cose
_\_V V_/_ V_/ \_V Quando non ci capiamo,
Maggiori informazioni sulla lista
linuxludus