Attributi di classe Reset quando importati dal pacchetto
Domanda
Ho un progetto che è organizzato qualcosa come
project/
__init__.py
builder.py
component/
__init__.py
.
Entro builder.py
, ho una classe chiamata Builder che ha diversi attributi di classe per implementare il modello Borg.Il problema sorge quando provo a importare il costruttore in component/__init__.py
e apportare modifiche agli attributi di classe.Sembra che qualunque cosa modifica piaccia agli attributi di classe nel pacchetto siano annullati quando la funzione restituisce.
Aggiornamento: qui è un semplice esempio di cosa sta succedendo.
Builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
.
Componente / ___ Init ___. PY
from project.builder import Builder
Builder.attribute = False
.
Uscita:
False
True
.
A giudicare dal fatto che vengono stampate due linee, immagino che il codice in builder.py
viene eseguito due volte, il che ripristina il valore di attribute
a TRUE.
Soluzione
Quello che hai è un'importazione circolare: il componente delle importazioni del costruttore, il componente import Builder.
Al componente IMPORTS Time Builder, Builder non è ancora completamente costruito.Quindi componente Importa Builder, che esegue il modulo di riposo del modulo Builder (tutto dopo import component
).Successivamente, quando il componente è caricato, il costruttore continua di nuovo con tutto dopo import component
.
Nota che il comportamento sarebbe diverso se il componente è stato caricato prima!
Fondamentalmente, non dovresti fare importazioni circolari.Prova a organizzare il codice in qualche altro modo.
Altri suggerimenti
Dovresti davvero mostrare (una versione semplificata di) il tuo codice.Qualcosa di simile (assumendo E.G. che project
è in sys.path):
import builder
builder.Builder.baah = 'boo!'
.
In component/__init__.py
, ad esempio, dovrebbe funzionare bene senza "annullamento" né "reset".
Ma quale codice esattamente è che usi invece, per eseguire quelle "Qualunque cosa cambia" ...?