Я строю модуль, в котором есть множество разнообразных объектов, которыми нужно управлять несколькими переменными.
Если бы это был C, я бы передал объектам указатель на переменную / объект, который я хочу, чтобы они наблюдали, чтобы приложение изменило переменную так, как нужно, и объекты в модуле "увидели бы" новое значение .
В модуле foo.py:
class foo(object):
def __init__(self, varToWatch):
self.varToWatch = varToWatch
def DoSomething(self):
print self.varToWatch
В приложении bar.py:
import foo
x = "before"
y = foo.foo(x)
y.DoSomething()
x = "after"
y.DoSomething()
Конечно, это не работает, потому что исходное значение x (или ссылка на исходное значение x?) Хранится в y. Вы получаете «до» «до».
Итак, я стараюсь ...
- Передача имени глобала и обращение к глобалу по имени в foo. Не надо, потому что глобал находится в пространстве приложения, а не в модуле.
- Использование global в пространстве имен foo, но я не знаю, как обращаться к этому пространству по имени переменной, и в настоящее время мы выполняем импорт * из foo, а не import foo. Менять это было бы больно.
- Создать словарь в модуле и передать имя ключа в словаре объектам в модуле. Управляйте содержимым словаря из приложения. По сути, я определяю новое глобальное пространство и вставляю в него переменные. Я не вижу причин, по которым это не сработает, но мне это неопрятно. Это я не знаком с Python?
Я не нахожу, что красивые решения, которые я привык видеть, легко приходят с Python, поэтому я подозреваю, что что-то упустил.
Предложения
ТИА,
- Тим.