pal201
Март 22, 2010 12:00:40
Помогите пожалуйста:
есть модуль в котором есть словарь dict={}
есть есть несколько модулей, которые импортируются в главный модуль import modul….
нужно обеспечить возможность из каждого модуля изменять значения словаря. Как решить проблему? Даже если объявить в каждом модуле global dict, все равно не видно тот словарь, что объявлен в главном модуле ведь на сколько я понимаю - область видимости global - модуль ;-(
regall
Март 22, 2010 12:20:41
Gunjy
Март 22, 2010 18:47:29
Да, глобальная область видимости - это модуль, но что тебе мешает импортировать основной модуль со словарём в остальные модули.
pal201
Март 23, 2010 07:33:24
Спасибо! Дейчтвительно, так и нужно поступить. Что это я не допер сам?! Еще раз спасибо!
lizzard
Март 24, 2010 00:23:45
Перекрёстный импорт? По моему не самая лучшая идея, лучше поменять архитектуру, имхо :). Как вариант, можно вынести нужный словарь в отдельный модуль и импортировать его везде, где надо, или передавать в качестве параметра, в зависимости от того, что Вам конкретно надо.
pal201
Март 25, 2010 14:33:23
Да да, именно в отдельный модуль. Только вероятно возникнет проблема, что после импортирования область видимости станет локальной и изменятся будет не общий словарь, а экземпляр конкретного модуля.
Еще вопрос:
нужно из одного модуля обращаться к методам другого.
В главном модуле созданы экземпляры классов из модуля а и модуля б, из главного модуля я прекрасно могу работать с методами экземпляров классов каждого модуля. Но мне так же нужно, что бы модули могли ображться сми к методам другого модуля. Как сделать так что бы они видели друг друга?
Спасибо!
lizzard
Март 25, 2010 15:21:31
# a.py:
from shared import d
print 'Before import:', d
d[0] = 'modified by a'
import b
print 'After import:', d
b.change_d()
print 'After b.change_d()', d
# b.py:
from shared import d
print '[b] d:', d
d[0] = 'modified by b'
def change_d():
d[1] = 'changed by b'
# shared.py:
d = {0: 123, 1: 321}
Результат выполнения a.py:
Before import: {0: 123, 1: 321}
[b] d: {0: 'modified by a', 1: 321}
After import: {0: 'modified by b', 1: 321}
After b.change_d() {0: 'modified by b', 1: 'changed by b'}
Вы про это?
Насчёт модулей, не буду оригинальным, но по моему лучше опять поменять структуру проекта :).
pal201
Март 25, 2010 15:54:59
Логика обработки каждого модуля сделана в классе модуля:
a.py
class parser():
код обработки событий сокета
class parser() должен обращаться к методам b
b.py
class parser():
код обработки событий
class parser() должен обращаться к методам a
экземпляры класса создаются в гланом модуле.
Что я делаю не правильно?
Спасибо!
pal201
Март 25, 2010 18:40:40
Начал переделывать структуру, как и рекомендовали. Подумал, а ведь можно в другой класс передать self исходного класса, но как? Имею ввиду:
class a():
def __init__(sefl,obj):
self.obj-obj
тело класса
class b():
с=a(self)
передать ссылку на самого себя, правильно я делаю?
и тогда из другого модуля(класса) можно будет работать с методами класса b я правильно понимаю?
lizzard
Март 25, 2010 19:05:33
pal201, можете подробнее описать что и зачем вы хотите сделать? Зачем одному классу вызывать методы другого класса, если первый не содержит объектов второго класса?