2017-02-01 12 views
1

Предположим, что два модуля Python под названием GlobVars и MyModule.Доступ к глобальной переменной через модули и staticmethods в 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 содержит класс с двумя функциями (_concat и getConcat), один из которых (т.е. _concat) является STATICMETHOD, который пытается получить доступ к вышеупомянутой глобальной переменной. Функция getConcat обращается к статическому методу и должна возвращать конкатенированную строку.

# 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, глобальная переменная, кажется, не правильно обращались. Почему это и каково решение?

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

В вашем конкретном случае, вы не должны использовать ключевое слово global ни GlobVars класса.

Вместо:

# 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 

Кстати питон документы имеет небольшой раздел о глобальном обмене ВАРА между разным модулями: https://docs.python.org/3/faq/programming.html?highlight=global#how-do-i-share-global-variables-across-modules

+1

Спасибо, что указали это. Простейшее решение часто не приходит в голову. –