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