Mi chiedevo se fosse possibile evitare alcuni degli svantaggi dell'utilizzo di variabili globali (vedi ad esempio http://wiki.c2.com/?GlobalVariablesAreBad ) utilizzando uno spazio dei nomi di classe piuttosto che uno spazio dei nomi globale / modulo per passare i valori delle variabili . Il codice seguente indica che i due metodi sono essenzialmente identici. C'è un leggero vantaggio nell'usare gli spazi dei nomi delle classi come spiegato di seguito.
I seguenti frammenti di codice mostrano anche che attributi o variabili possono essere creati ed eliminati dinamicamente sia negli spazi dei nomi globali / modulo che negli spazi dei nomi delle classi.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Chiamo questo modulo "wall" poiché viene utilizzato per rimbalzare le variabili. Agirà come uno spazio per definire temporaneamente le variabili globali e gli attributi a livello di classe della classe vuota "router".
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Questo modulo importa wall e definisce una singola funzione sourcefn
che definisce un messaggio e lo emette tramite due diversi meccanismi, uno tramite globals e uno tramite la funzione router. Notare che le variabili wall.msg
e wall.router.message
sono definite qui per la prima volta nei rispettivi spazi dei nomi.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Questo modulo definisce una funzione destfn
che utilizza i due diversi meccanismi per ricevere i messaggi emessi dalla sorgente. Consente la possibilità che la variabile "msg" non esista. destfn
cancella anche le variabili una volta che sono state visualizzate.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Questo modulo chiama in sequenza le funzioni definite in precedenza. Dopo la prima chiamata alle dest.destfn
variabili wall.msg
e wall.router.msg
non esistono più.
L'output del programma è:
globale: Hello world!
router: ciao mondo!
globale: nessun messaggio
router: nessun messaggio
I frammenti di codice sopra mostrano che i meccanismi delle variabili module / global e class / class sono essenzialmente identici.
Se devono essere condivise molte variabili, l'inquinamento dello spazio dei nomi può essere gestito utilizzando diversi moduli di tipo wall, ad esempio wall1, wall2 ecc. O definendo diverse classi di tipo router in un singolo file. Quest'ultimo è leggermente più ordinato, quindi rappresenta forse un vantaggio marginale per l'uso del meccanismo delle variabili di classe.