[PIPython] Dati statici

Simone Piunno pioppo
Ven 25 Feb 2005 16:41:32 CET


On Friday 25 February 2005 11:12, Luca Fabbri wrote:

> Provengo dal mondo di programmazione Java.
> Vorrei capire in Python come si definiscono dati (variabili, oggetti)
> statici all'interno di una classe.
> Per i metodi ho trovato staticmethod ma non riesco a trovare
> l'informazione per i dati comuni.

Nel seguito ti risparmio la differenza tra classi classiche e classi newstyle, 
che potrai eventualmente approfondire in seguito.  Userò solo classi 
newstyle.

Prima di tutto in python una classe è anch'essa una istanza, di un'altra 
classe, e via così ricorsivamente.

Si può passare da una da un istanza alla relativa classe, attraverso 
l'attributo speciale __class__

>>> a=1
>>> a.__class__
<type 'int'>
>>> a.__class__.__class__
<type 'type'>
>>> a.__class__.__class__.__class__
<type 'type'>

per rendere un attributo comune a tutte le istanze di una classe, lo si rende 
attributo della classe.

>>> class esempio(object):
...     comune = 'valore comune'
...     def __init__(self):
...         self.noncomune = 'pluto'
...     def setcomune(self,val):
...         self.__class__.comune = val
...     def setnoncomune(self,val):
...         self.noncomune = val
...     def vedi(self):
...         print self.comune
...         print self.noncomune
...
>>> es1 = esempio()
>>> es2 = esempio()
>>> es1.setnoncomune('istanza1')
>>> es2.setnoncomune('istanza2')
>>> es1.setcomune('val1')
>>> es2.setcomune('val2')
>>> es1.vedi()
val2
istanza1
>>> es2.vedi()
val2
istanza2

Ora nota come self.comune, in lettura, funzioni anche quando comune è nella 
classe, questo a causa della sequenza di fallback che vengono provati durante 
la ricerca del nome "comune" applicato al self.  Se "comune" non esiste nel 
namespace locale dell'istanza, verrà cercato automaticamente nel namespace 
della classe.  Ma non provare a riassegnare self.comune = qualcosa, perchè 
così facendo inseriresti "comune" nel namespace locale dell'istanza, 
mascherando il "comune" di classe.

-- 
Adde parvum parvo magnus acervus erit -- Ovidio


More information about the Python mailing list