Angenommen, zwei Python-Module mit den Titeln GlobVars
und MyModule
.Zugriff auf globale Variable über Module und statische Methoden in Python
Das Modul GlobVars
dient zur Versorgung des anderen Moduls mit der globalen Variablen my_glob_var
.
# cat GlobVars.py
class getGlobVars:
def __init__(self):
global my_glob_var
my_glob_var = 'World'
def go(self):
pass
Module MyModule
eine Klasse mit zwei Funktionen enthält (_concat
und getConcat
), von denen eines (das heißt _concat
) ist ein static dass die zuvor genannte globale Variable für den Zugriff versucht. Die Funktion getConcat
greift auf die statische Methode zu und soll eine verkettete Zeichenfolge zurückgeben.
# cat MyModule.py
import GlobVars as GV
class MyClass:
def __init__(self, var1):
self.var1 = var1
@staticmethod
def _concat(var2):
GV.getGlobVars().go()
return var2 + my_glob_var
def getConcat(self):
return MyClass._concat('Hello ')+self.var1
Wenn ich versuche, beiden Module zu laden und auszuführen Funktion getConcat
, die globale Variable scheint nicht richtig zugegriffen werden. Warum ist das und was ist die Lösung?
import MyModule
import GlobVars
print MyModule.MyClass('!').getConcat()
# NameError: global name 'my_glob_var' is not defined
1. Globals Python sind nicht "global Globals", sind sie nur global zu das Modul, in dem sie definiert sind. 2. Sie brauchen nur das Schlüsselwort 'global', wenn Sie ein globales ändern möchten, Sie können ein globales Schlüsselwort ohne das Schlüsselwort lesen (und Sie sollten sowieso vermeiden, veränderbare globale Elemente zu verwenden). 3. Da Sie Python 2 verwenden, sollten Sie neue Klassen verwenden: Lassen Sie Ihre Klassen von 'object' erben, sonst erhalten Sie die minderwertigen Klassen im alten Stil. (Python 3 hat nur new-style, so dass Sie nicht explizit von "object" erben müssen, aber es ist immer noch schön, dies zu tun, da es die Rückkehr zu Python 2 erleichtert). –