2017-12-26 13 views
0

私はクラスを使用するグローバルオブジェクトを持っており、そのクラスはグローバルオブジェクトを使用しています。どのように私はきれいな方法で正しいの輸入を置くことができる円を使ってファイル全体にグローバルオブジェクトを共有する

私が今持っている:

run.py(私は実行ファイル)

from global_class import Global_class 
global_object = Global_class() 
global_object.create_some_object() 

global_class.py

from some_class import Some_class 
class Global_class: 
    def __init__(self): 
     self.name = 'my_name' 

    def create_some_object(self): 
     self.some_object = Some_class() 

some_classを.py

class Some_class: 
    def __init__(self): 
     print(global_object.name) 

どうすればSome_classのglobal_objectにアクセスできますか?私が置く場合:

from run import global_object 

それは循環依存関係を作成し、クラッシュします。私が考えた可能な方法は、some_classのインポートをGlobal_class :: create_some_object()メソッドに置くことでしたが、それは私には不潔なコードと思われます。

答えて

0

いずれかのPython import moduleまたはfrom module import Classステートメントは、対応するモジュールを1行ずつ実行し、メモリ内のモジュール名前空間内のすべてのオブジェクトを読み込みます。しかし、モジュール内の名前はそれぞれ別々に存在します(結局、モジュールの目的です)。したがってのsome_class.pyglobal_objectと完全に別のものです。run.pyです。インタープリタがsome_class.pyでこの名前を見ると、(ローカル、囲まれた、グローバルおよびビルトインを表すLEGBルールを使用して)ローカルおよびグローバル名前空間が検索されます。しかしここにはglobal_objectへの参照はありません。モジュールを呼び出しています。 some_classインポートステートメントをメソッドcreate_object()に入れるというあなたの提案も、同じ理由で機能しません。あなたが知っている通り、をsome_classにインポートすることはできません。これは再びrun.pyを実行してループを作成する必要があるためです。

あなたは、この設定を維持したい場合は、1つのオプションは、明示的に

#run.py                
from global_class import Global_class 
global_object = Global_class() 
global_object.create_some_object() 

#global_class.py 
from some_class import Some_class 
class Global_class: 
    def __init__(self): 
     self.name = 'my_name' 

    def create_some_object(self): 
     self.some_object = Some_class(self) #self -> global_object 

#some_class.py 
class Some_class: 
    def __init__(self, global_object): 
     print(global_object.name) 

$ python run.py 
my_name 
以下のよう Some_class()コンストラクタに Global_classselfある global_objectを渡すことであろう
関連する問題