Atributos de classe redefinidos quando importados do pacote
Pergunta
Eu tenho um projeto que está organizado algo como
project/
__init__.py
builder.py
component/
__init__.py
Dentro de builder.py
, tenho uma classe chamada Builder que possui vários atributos de classe para implementar o padrão Borg.O problema surge quando tento importar o Builder em component/__init__.py
e faça alterações nos atributos da classe.Parece que quaisquer alterações que eu faça nos atributos de classe do pacote serão desfeitas quando a função retornar.
ATUALIZAR:Aqui está um exemplo simples do que está acontecendo.
construtor.py
class Builder(object):
attribute = True
import component
print Builder.attribute
componente/___init___.py
from project.builder import Builder
Builder.attribute = False
Saída:
False
True
A julgar pelo fato de que duas linhas são impressas, eu diria que o código em builder.py
está sendo executado duas vezes, o que zera o valor de attribute
para Verdadeiro.
Solução
O que você tem é uma importação circular:construtor importa componente, construtor de importações de componente.
No momento em que o construtor importa o componente, o construtor ainda não está totalmente construído.Em seguida, o componente importa o construtor, que executa o resto do módulo construtor (tudo depois import component
).Mais tarde, quando o componente é carregado, o construtor continua novamente com tudo depois import component
.
Observe que o comportamento seria diferente se o componente fosse carregado primeiro!
Basicamente, você não deve fazer importações circulares.Tente organizar o código de alguma outra forma.
Outras dicas
Você realmente deveria mostrar (uma versão simplificada) do seu código.Algo como (assumindo, por ex.que project
está em sys.path):
import builder
builder.Builder.baah = 'boo!'
em component/__init__.py
, por exemplo, deve funcionar bem, sem "desfazer" nem "redefinir".
Mas qual código exatamente são você está usando, em vez disso, para realizar essas "quaisquer alterações" ...?