パッケージからインポートされるとクラス属性がリセットされます
質問
私は
のようなものを編成されたプロジェクトを持っていますproject/
__init__.py
builder.py
component/
__init__.py
.
builder.py
内では、BORGパターンを実装するためにいくつかのクラス属性を持つBuilderというクラスがあります。component/__init__.py
でBuilderをインポートしてクラス属性を変更しようとすると、トラブルが発生します。関数が戻ったときに、パッケージ内のクラス属性に行く変更が元に戻されるようです。
アップデート:ここで何が起こっているのかの簡単な例です。
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
.
成分/ ___ init ___。py
from project.builder import Builder
Builder.attribute = False
.
出力:
False
True
.
2行が印刷されているという事実によって判断されると、builder.py
のコードが2回実行されていると思います。これはattribute
の値をtrueにリセットします。
解決
あなたが持っているものは循環インポートです:ビルダーのインポートコンポーネント、コンポーネントのインポートビルダー。
Time Builderのインポートコンポーネントでは、Builderはまだ完全に構築されていません。その後、コンポーネントをImports Builderをインポートします。後で、コンポーネントがロードされると、import component
の後にビルダーがすべて継続します。
コンポーネントが最初にロードされた場合、動作は異なることに注意してください。
基本的には、循環輸入をしてはいけません。他の方法でコードを整理してみてください。
他のヒント
あなたは本当にあなたのコードを表示するべきです(の単純化されたバージョンです)。(例えば、project
がsys.pathにあること)のようなもの:
import builder
builder.Builder.baah = 'boo!'
.
component/__init__.py
は、例えば、「元に戻す」または「リセット」を持たないだけでうまく機能する必要があります。
しかし、代わりにがであるものは、代わりに使用しています。