2017-02-01 16 views
1

GlobVarsMyModuleの2つのPythonモジュールを想定します。Pythonのモジュールと静的メソッド間のグローバル変数へのアクセス

モジュールGlobVarsは、他のモジュールにグローバル変数my_glob_varを提供することを目的としています。

# cat GlobVars.py 
class getGlobVars: 
    def __init__(self): 
     global my_glob_var 
     my_glob_var = 'World' 
    def go(self): 
     pass 

モジュールMyModuleは2つの機能(_concatgetConcat)、のいずれかでクラスを含む(すなわち、_concat)は、前述のグローバル変数にアクセスしようとstaticmethodあります。関数getConcatはstaticmethodにアクセスし、連結された文字列を返すことになっています。

# 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 

私は両方のモジュールをロードし、機能getConcatを実行しようと

は、グローバル変数が適切にアクセスしていないようです。それはなぜですか、そしてその解決策は何ですか?あなたは globalキーワードも GlobVarsクラスを使用する必要はありません、あなたの特定のケースで

import MyModule 
import GlobVars 
print MyModule.MyClass('!').getConcat() 
# NameError: global name 'my_glob_var' is not defined 
+1

1. Pythonのグローバルが「グローバルグローバル」ではありません、彼らはへの唯一のグローバルです定義されているモジュール2.グローバルを変更する場合は 'global'キーワードだけが必要です。キーワードなしでグローバルを読むことができます(とにかく変更可能なグローバルを使わないでください)。 3. Python 2を使用しているので、新しいスタイルのクラスを使うべきです:クラスを 'object'から継承させる、そうでなければ古い古いスタイルのクラスを取得します。 (Python 3は新しいスタイルしか持っていないので、 'object'から明示的に継承する必要はありませんが、Python 2にバックポートするのが簡単になるので、やってみるといいです。 –

答えて

1

代わりに:

# 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 

Pythonのドキュメントは、モジュール間でグローバルVARSを共有について少しセクションを持っているところで:https://docs.python.org/3/faq/programming.html?highlight=global#how-do-i-share-global-variables-across-modules

+1

これを指摘してくれてありがとう。最も簡単な解決法はしばしば心に浮かびません。 –

関連する問題