2017-02-01 3 views
1

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

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). –

Antwort

1

In Ihrem Fall müssen Sie global Schlüsselwort noch GlobVars Klasse nicht verwenden.

Statt:

# cat GlobVars.py 
my_glob_var = 'World' 

# cat MyModule.py 
import GlobVars as GV 
class MyClass: 
    def __init__(self, var1): 
     self.var1 = var1 

    @staticmethod 
    def _concat(var2): 
     return var2 + GV.my_glob_var 

    def getConcat(self): 
     return MyClass._concat('Hello ')+self.var1 

Durch die Art und Weise Python docs haben wenig Abschnitt über die globale Vars über Module teilen https://docs.python.org/3/faq/programming.html?highlight=global#how-do-i-share-global-variables-across-modules

+1

Vielen Dank, dass Sie darauf hingewiesen haben. Die einfachste Lösung kommt mir oft nicht in den Sinn. –

Verwandte Themen