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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top