[PIPython] Membri di classe e membri di oggetto (lungo)

Luca Fabbri lucafbb
Mer 30 Mar 2005 14:03:45 CEST


Per chi ne ha voglia...

Scusate, sto sviluppando alcune applicazioni in un ambiente che
sfrutta python in modo indiretto, senza però avere grosse conoscenze
di python stesso né un libro di testo che posso definire molto
buono...

Qualche tempo fa avevo postato una domanda su come definire tipi di
dato statici in python. Proveniendo dalla programmazione Java, per
tali tipi di dato intendo variabili interni ad una classe (e.g: classe
MyClass), accessibili da tutti gli oggetti istanza di questa classe (a
= MyClass(); b= MyClass()...) ma che siano unici (diciamo di avere
quindi una variabile intera "mycostante = 5").
Con questo intendo soprattutto che la modifica di questa variabile,
comunque venga fatta, sia quindi visibile immediatamente a tutti gli
oggetti in quanto la variabile mycostante è unica.

Qualcuno mi aveva risposto e la soluzione era ok, per quanto dal punto
di vista della programmazione ad oggetti non mi soddisfaceva.
Per quanto sia un gran tifoso di Java e mi piaccia molto come
linguaggio, sempre più persone mi dicono che python è davvero molto
meglio per tantissimi aspetti, eppure la soluzione che ho adottato non
rispettava esattamente l'dea di membro di classe statico che mi era
tanto chiara in Java e che trovavo molto semplice...

Ok, questo è solo un lungo preambolo!

Oggi però mi sono accorto di qualcosa di nuovo:

Fino ad oggi, scrivendo qualcosa del genere...

class MyClass:
   myvariabile = 5
   ...

...credevo di non aver fatto altro che definire un normale membro
della classe, ossia generando poi questo codice:

a = MyClass()
b = MyClass()

a e b sono due istanze con due distinti membri chiamati myvariabile;
modificando a.myvariabile, b.myvariabile rimane al valore iniziale.

Per puro caso oggi mi sono accorto che invece pare che tutte le
istanze di MyClass condividano la stessa area di memoria di
myvariabile, ossia se modifico a.myclass, lo stesso valore sarà
accessibile con b.myclass...

A parte l'infarto che quasi mi prendeva per il non aver capito nulla
di come stanno le cose, ho ripreso in mano quella tristezza di libro
che ho e mi sono accorto che per definire membri della classe
"normali", ossia col comportamento che mi aspettavo, viene utilizzato:

def __init__(self, id, **kwargs):
   ...
   self.myvariabile = 5
   ...

Senza che myvariabile sia definita da qualsiasi altra parte
all'interno della classe...
A questo punto credo che l'altra volta abbia postato una richiesta che
chi è stato tanto gentile da analizzare non abbia capito in quanto
potrei essermi spiegato piuttosto male (o io non ho capito le
risposte?!?) e di certo l'equivoco è che fin'ora ho scritto oggetti
come li avrei scritti in Java...

Ora però ho bisogno di qualche certezza, non vorrei aver preso un
altro abbaglio:

1) Definendo self.myvariabile dentro ad __init__, ho effettivamente
creato una variabile interna all'istanza dell'oggetto e che quindi il
valore di questa viene memorizzata nell'area di memoria dell'oggetto?

2) Definendo myvariabile dentro al corpo principale della classe,
questa è diventata una variabile di classe, la cui esistenza è unica?

Ringrazio anticipatamente tutti quelli che hanno la pazienza di rispondermi...

PS: Nessuno ha per caso un link da inviarmi per un buon manuale su web
da leggere? Premetto che la documentazione trovata sotto python.org
(es: il tutorial) non l'ho affatto trovata buona o completa.

Saluti.


More information about the Python mailing list