パッケージからインポートされるとクラス属性がリセットされます

StackOverflow https://stackoverflow.com/questions/3216908

  •  13-09-2020
  •  | 
  •  

質問

私は

のようなものを編成されたプロジェクトを持っています
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は、例えば、「元に戻す」または「リセット」を持たないだけでうまく機能する必要があります。

しかし、代わりにであるものは、代わりに使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top