Атрибуты класса сбрасываются при импорте из пакета
Вопрос
У меня есть проект, который организован примерно так
project/
__init__.py
builder.py
component/
__init__.py
Внутри builder.py
, У меня есть класс под названием Builder, который имеет несколько атрибутов класса для реализации шаблона Borg.Проблема возникает, когда я пытаюсь импортировать Builder в component/__init__.py
и внесите изменения в атрибуты класса.Кажется, что любые изменения, которые я вношу в атрибуты класса в пакете, отменяются при возврате функции.
ОБНОВЛЕНИЕ:Вот простой пример того, что происходит.
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
component/___init___.py
from project.builder import Builder
Builder.attribute = False
Выход:
False
True
Судя по тому факту, что напечатаны две строки, я бы предположил, что код в builder.py
выполняется дважды, что сбрасывает значение attribute
к Истине.
Решение
То, что у вас есть, - это циклический импорт:конструктор импортирует компонент, компонент импортирует конструктор.
На момент импорта компонента builder builder еще не полностью создан.Затем компонент импортирует builder, который выполняет остальную часть модуля builder (все после import component
).Позже, когда компонент загружен, builder снова продолжает работу со всем, что было после import component
.
Обратите внимание, что поведение было бы другим, если бы компонент был загружен первым!
В принципе, вам не следует выполнять циклический импорт.Попробуйте организовать код каким-нибудь другим способом.
Другие советы
Вы действительно должны показать (упрощенную версию) своего кода.Что-то вроде (предполагая, напримертот project
находится в системном пути):
import builder
builder.Builder.baah = 'boo!'
в component/__init__.py
, например, должно работать просто отлично без "отмены" или "сброса".
Но какой именно код являются вы используете вместо этого, чтобы выполнить эти "любые изменения"...?