Les attributs de classe de réinitialisation lors de l'importation de colis
Question
J'ai un projet qui est organisé quelque chose comme
project/
__init__.py
builder.py
component/
__init__.py
Au sein de builder.py
, J'ai une classe appelée Constructeur qui dispose de plusieurs attributs de classe afin de mettre en œuvre le Borg modèle.Le problème se pose lorsque j'essaie d'importer Constructeur en component/__init__.py
et de modifier les attributs de classe.Il semble que peu importe les modifications que je fais pour les attributs de classe dans le package sont annulées si la fonction retourne.
Mise à JOUR:Voici un exemple simple de ce qui se passe.
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
component/___init___.py
from project.builder import Builder
Builder.attribute = False
Sortie:
False
True
À en juger par le fait que les deux lignes sont imprimées, je suppose que le code de la builder.py
est exécutée deux fois, ce qui réinitialise la valeur de attribute
à Vrai.
La solution
Ce que vous avez est une importation circulaire:constructeur importations du composant importations builder.
Au moment constructeur importations de composants, le constructeur n'est pas encore totalement construit.Ensuite composant importations builder, qui exécute le reste de module générateur (tous les après import component
).Plus tard, lorsque le composant est chargé, le constructeur continue encore avec tout ce qui est après import component
.
Notez que le comportement serait différent si le composant a été chargé en premier!
En fait, vous ne devriez pas faire la circulaire importations.Essayez d'organiser le code d'une autre façon.
Autres conseils
Vous devriez vraiment montrer (une version simplifiée de votre code.Quelque chose comme (en supposant par exempleque project
est dans sys.chemin d'accès):
import builder
builder.Builder.baah = 'boo!'
dans component/__init__.py
, par exemple, devrait fonctionner très bien avec, pas de "défaire", ni de "réinitialiser".
Mais ce code exactement sont vous utilisez à la place, pour l'exécution de ces "changements"...?