[Python] Consiglio su utilizzo di variabili globali

Mr.SpOOn mr.spoon21 a gmail.com
Gio 8 Maggio 2008 19:02:33 CEST


> On Sat, May 3, 2008 at 4:11 PM, enrico franchi
>  >  Io potrei suggerirti di prendere in considerazione il pattern
>  >  Monostate/Borg (fra i pythonisti è noto come Borg storicamente, ma di
>  >  fatto è quello che altri chiamano Monostate).

Mi sono reso conto che forse questo pattern non fa al caso mio. E' che
all'inizio, per non perdermi in dettagli, ho semplificato troppo il
problema.

Se non ho capito male, nel pattern Borg l'istanza della classe deve
essere unica.

Nella mia applicazione ho delle esigenze differenti.
All'interno dell'applicazione ho una classe che si occupa di
manipolare del testo, in pratica. Ho un'interfaccia grafica, anche,
quindi, graficamente, alla classe sono associate caselle di testo,
bottoni etc, tutti contenuti in un pannello.

L'idea è di poter avere più pannelli (quindi più istanze della classe)
aperti contemporaneamente, in modo da poter fare dei confronti fra
diversi modi di operare.
E, ovviamente, le variabili delle diverse istanze devono essere diverse.

Finora, forse sottovalutando la questione, ho fatto così:
ho una classe principale del genere:

class MyClass(wx.Frame):
    ....
    pannello = Pannello(self, -1)


E poi la classe Pannello fatta così:

class Pannello(wx.Panel):
    stringa = "prova"

     def stampa(self):
          ...
     def modifica(self, s):
          ...

All'apertura dell'applicazione, mi interessa che si veda da subito un
Pannello, per questo istanzio la classe lì. Ora mi rendo conto che
questo forse non è molto funzionale. Insomma, non so se mi sfugge
qualcosa, ma se ad un certo punto mi servisse creare istanze della
classe Pannello, ad esempio, premendo su un bottone, come dovrei fare?
Non posso assegnarle a delle variabili. Qual è la soluzione in casi
come questo? Un metodo createPannello che mi ritorna istanze della
classe?

Riguardo le variabili: come ho detto, la variabile "stringa" mi serve
all'interno di tutta la classe, ma dev'essere diversa per ogni
istanza. Se non ho capito male, definendola come ho fatto prima, non
va bene, perché avrò una variabile di classe unica e ogni istanza
condividerà lo stesso valore. Quindi immagino di doverle definire
all'interno del metodo __init__ corrispondente. Ma mi blocco qui,
perché facendo delle prove non riesco ad accedere alla variabile. Sto
provado nella shell di Python con qualcosa di semplicissimo.

class Prova:
...   def __init__(self):
...      self.x = 5
...

>>> p = Prova

>>> p
<class __main__.Prova at 0xb796683c>

>>> p.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class Prova has no attribute 'x'

Cos'è che sbaglio? Ho letto diverse cose, ma proprio non riesco a capire.
Scusate l'email chilometrica, ma spero di chiarirmi finalmente dei dubbi.
Grazie.


Maggiori informazioni sulla lista Python