Klassenattribute werden beim Import aus dem Paket zurückgesetzt
Frage
Ich habe ein Projekt, das so etwas organisiert ist
project/
__init__.py
builder.py
component/
__init__.py
Innerhalb builder.py
, Ich habe eine Klasse namens Builder, die über mehrere Klassenattribute verfügt, um das Borg-Muster zu implementieren.Das Problem tritt auf, wenn ich versuche, Builder zu importieren component/__init__.py
und Änderungen an Klassenattributen vornehmen.Es scheint, dass alle Änderungen, die ich an den Klassenattributen im Paket vornehme, rückgängig gemacht werden, wenn die Funktion zurückkehrt.
AKTUALISIEREN:Hier ist ein einfaches Beispiel dafür, was passiert.
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
Komponente/___init___.py
from project.builder import Builder
Builder.attribute = False
Ausgabe:
False
True
Aufgrund der Tatsache, dass zwei Zeilen gedruckt werden, würde ich vermuten, dass der Code in builder.py
wird zweimal ausgeführt, wodurch der Wert von zurückgesetzt wird attribute
zu Wahr.
Lösung
Was Sie haben, ist ein zirkulärer Import:Builder importiert Komponenten, Komponenten importieren Builder.
Zum Zeitpunkt des Imports der Komponente durch den Builder ist der Builder noch nicht vollständig erstellt.Dann importiert die Komponente den Builder, der den Rest des Builder-Moduls ausführt (alles danach). import component
).Später, wenn die Komponente geladen wird, fährt der Builder erneut mit allem fort, was danach folgt import component
.
Beachten Sie, dass das Verhalten anders wäre, wenn die Komponente zuerst geladen würde!
Grundsätzlich sollten Sie keine zirkulären Importe durchführen.Versuchen Sie, den Code auf andere Weise zu organisieren.
Andere Tipps
Sie sollten Ihren Code wirklich (eine vereinfachte Version) zeigen.Etwas wie (vorausgesetzt z.B.Das project
ist in sys.path):
import builder
builder.Builder.baah = 'boo!'
In component/__init__.py
, sollte zum Beispiel einwandfrei funktionieren, ohne „Rückgängigmachen“ oder „Zurücksetzen“.
Aber welcher Code genau Sind Verwenden Sie stattdessen, um diese „Welche Änderungen auch immer“ durchzuführen ...?