Предположим, что два модуля 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. Python глобал не являются «глобальными Глобал», они только глобальными модуль, в котором они определены. 2. Вам нужно только ключевое слово 'global', если вы хотите изменить глобальное, вы можете прочитать глобальное без ключевого слова (и вы должны избегать использования изменяемых глобальных переменных). 3. Поскольку вы используете Python 2, вы должны использовать классы нового стиля: сделать ваши классы наследуемыми от 'object', иначе вы получите классы младшего старого стиля. (Python 3 только имеет новый стиль, поэтому вам не нужно явно наследовать от 'object', но это все равно приятно, так как упрощает обратный перенос на Python 2). –