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.

Était-ce utile?

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"...?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top