Ich habe mich gefragt, ob es möglich ist, einige der Nachteile der Verwendung globaler Variablen (siehe z. B. http://wiki.c2.com/?GlobalVariablesAreBad ) zu vermeiden, indem ein Klassennamensraum anstelle eines globalen / Modul-Namespace verwendet wird, um Werte von Variablen zu übergeben . Der folgende Code zeigt an, dass die beiden Methoden im Wesentlichen identisch sind. Es ist ein kleiner Vorteil, Klassennamensräume zu verwenden, wie unten erläutert.
Die folgenden Codefragmente zeigen auch, dass Attribute oder Variablen sowohl in globalen / Modul-Namespaces als auch in Klassennamensräumen dynamisch erstellt und gelöscht werden können.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Ich nenne dieses Modul "Wand", da es zum Abprallen von Variablen verwendet wird. Es dient als Leerzeichen zum vorübergehenden Definieren globaler Variablen und klassenweiter Attribute der leeren Klasse 'Router'.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Dieses Modul importiert wall und definiert eine einzelne Funktion, sourcefn
die eine Nachricht definiert und über zwei verschiedene Mechanismen ausgibt, einen über globale und einen über die Router-Funktion. Beachten Sie, dass die Variablen wall.msg
und wall.router.message
hier zum ersten Mal in ihren jeweiligen Namespaces definiert werden.
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'
Dieses Modul definiert eine Funktion, destfn
die die zwei verschiedenen Mechanismen verwendet, um die von der Quelle ausgegebenen Nachrichten zu empfangen. Dies ermöglicht möglicherweise, dass die Variable 'msg' nicht vorhanden ist. destfn
löscht auch die Variablen, sobald sie angezeigt wurden.
main.py.
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Dieses Modul ruft die zuvor definierten Funktionen nacheinander auf. Nach dem ersten Aufruf dest.destfn
der Variablen wall.msg
und wall.router.msg
nicht mehr vorhanden.
Die Ausgabe des Programms lautet:
global: Hallo Welt!
Router: Hallo Welt!
global: keine Nachricht
Router: keine Nachricht
Die obigen Codefragmente zeigen, dass die Mechanismen module / global und class / class variable im Wesentlichen identisch sind.
Wenn viele Variablen gemeinsam genutzt werden sollen, kann die Namespace-Verschmutzung entweder mithilfe mehrerer Wandmodule, z. B. Wand1, Wand2 usw., oder durch Definieren mehrerer Routertypklassen in einer einzigen Datei verwaltet werden. Letzteres ist etwas aufgeräumter und stellt daher möglicherweise einen geringfügigen Vorteil für die Verwendung des Mechanismus mit Klassenvariablen dar.