Атрибуты класса сбрасываются при импорте из пакета - PullRequest
1 голос
/ 10 июля 2010

У меня есть проект, который организован что-то вроде

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

компонент / ___ ___ INIT. Ру

from project.builder import Builder

Builder.attribute = False

Выход:

False
True

Судя по тому, что напечатаны две строки, я бы предположил, что код в builder.py выполняется дважды, что сбрасывает значение attribute в True.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Имеется циклический импорт: компонент импорта компонента сборки, компонент импорта компонента сборки.

В то время, когда компонент-сборщик импортирует компонент, он еще не полностью создан.Затем компонент импортирует компоновщик, который выполняет остальную часть модуля компоновщика (все после import component).Позже, когда компонент загружен, компоновщик продолжает снова все после import component.

Обратите внимание, что поведение будет другим, если компонент был загружен первым!,Попробуйте организовать код другим способом.

0 голосов
/ 10 июля 2010

Вы должны действительно показать (упрощенную версию) свой код.Что-то вроде (при условии, например, что project находится в sys.path):

import builder
builder.Builder.baah = 'boo!'

в component/__init__.py, например, должно работать нормально, без «отмены» или «сброса».

Но какой именно код вы используете вместо этого, чтобы выполнить эти "любые изменения" ...?

...