Los atributos de clase se restablecen cuando se importan desde el paquete
Pregunta
Tengo un proyecto que está organizado algo así como
project/
__init__.py
builder.py
component/
__init__.py
Dentro builder.py
, Tengo una clase llamada Builder que tiene varios atributos de clase para poder implementar el patrón Borg.El problema surge cuando intento importar Builder en component/__init__.py
y realizar cambios en los atributos de clase.Parece que cualquier cambio que haga en los atributos de clase en el paquete se deshace cuando regresa la función.
ACTUALIZAR:He aquí un ejemplo sencillo de lo que está sucediendo.
constructor.py
class Builder(object):
attribute = True
import component
print Builder.attribute
componente/___init___.py
from project.builder import Builder
Builder.attribute = False
Producción:
False
True
A juzgar por el hecho de que se imprimen dos líneas, supongo que el código en builder.py
se ejecuta dos veces, lo que restablece el valor de attribute
a Verdadero.
Solución
Lo que tienes es una importación circular:El constructor importa el componente, el componente importa el constructor.
En el momento en que el constructor importa el componente, el constructor aún no está completamente construido.Luego, el componente importa el constructor, que ejecuta el resto del módulo constructor (todo después). import component
).Más tarde, cuando se carga el componente, el constructor continúa nuevamente con todo lo posterior. import component
.
Tenga en cuenta que el comportamiento sería diferente si el componente se cargara primero.
Básicamente, no deberías realizar importaciones circulares.Intente organizar el código de alguna otra manera.
Otros consejos
Realmente deberías mostrar (una versión simplificada de) tu código.Algo así como (asumiendo, por ejemplo.eso project
está en sys.path):
import builder
builder.Builder.baah = 'boo!'
en component/__init__.py
, por ejemplo, debería funcionar bien sin "deshacer" ni "restablecer".
Pero ¿qué código exactamente? son ¿Estás usando en su lugar, para realizar esos "cualquier cambio"...?