2012-03-01 19 views
0

インスタンス変数を別のファイルから変更することはできますか?別のファイルからインスタンス変数を変更しますか?

私が欲しいのは、File_1内のインスタンス変数をFile_2から変更することです。例えば

Traceback (most recent call last): 
File "File_1.py", line 4, in <module> 
    import File_2 
File "File_2.py", line 3, in <module> 
    import File_1 
File "File_1.py", line 14, in <module> 
    main.modify() 
File "File_1.py", line 11, in modify 
    File_2.modify() 
AttributeError: 'module' object has no attribute 'modify' 

理由:

//File 1 
import File_2 

class Main: 
    def __init__(self): 
     self.example = "Unmodified" 

    def modify(self): 
     File_2.modify() 

main = Main() 
main.modify() 


//File 2 
import File_1 

def modify(): 
    File_1.main.example = "Modified" 

これは私に次のような出力を提供しますか?

EDIT(よりよい説明する):
(ファイル1)メインクラスのインスタンス変数を有します。私が望むのは、その変数を別のファイル(ファイル2)から変更することです。私は少し変更したコード:

//File 1 
import File_2 

class Main: 
    def __init__(self): 
     self.example = "Unmodified" 

    def modify(self): 
     File_2.modify() 

if __name__ == "__main__": 
    main = Main() 
    main.modify() 


//File 2 
def modify(): 
    //do some stuff 
    //now I want to modify the example variable from the main class, but how? 

答えて

0

Pythonで動作しません。何があなたがやろうとしているこの「クロスインポート」である - あなたは両方のファイルが互いをインポートするとき、あなたは矛盾して望ましくない副作用を持っています。この場合、File_1の解析時にmain.modify()行が実行されても、まだ完全に初期化されていないメモリ内の「変更」機能がまだ存在しないモジュールが見つかります。

yoruコードを並べ替えることで、周期的なインポートがないので、正常に動作するはずです - たとえば、最初にインポートするファイル、またはメインモジュールとして実行するファイルがFile_2の中にあります。最初の行は、次のようにmodify関数内にインポートします。

#File 2 


def modify(): 
    import File_1 
    File_1.main.example = "Modified" 

NBこれらのインポートは、インタープリタ上ですでにインポートされているモジュールを参照しているため、すでにロードされているモジュールオブジェクトを実行中のスコープの変数にバインドするだけです。つまり、Pythonはモジュールに対してディスクアクセスを行いません関数が呼び出されるたびにファイルを作成します。

1

あなたのコードは、私が話していることを知るためにPython: Circular (or cyclic) importsを見てください。

基本的な問題であるというコンパイラは、このラインに来るとき:

def modify(): 
    File_1.main.example = "Modified" 

File_2.modify() 

File_2は、コンパイラはまだラインを読んでいないことをmenaning、完全にロードされていませんFile_1に戻ってから:

import File_1 

これ以外にも、コードはかなり変わっているようです。あなたの実際のコードについてより多くの情報を提供したい場合は、おそらくより優れたデザインが問題を解決する可能性があります。

編集:にはがあり、サイクリックインポートを削除します。あなたが必要とするように見えるものを行う一つの方法は、File_2.modify(arg)関数に引数を渡すことで、その上で動作:

# File_2 
# !! do NOT import File_1 in this file 
def modify(obj): 
    obj.value += 7 

しかし、あなたの場合には、あなたはmodifyにオブジェクト全体(self)を渡す必要があります1つの値だけを変更するのは無駄です。

のような何かを行う方が良いでしょう:あなたは、あなたの実際のコードを示すわけではないので、私たちは本当に多分(お使いの場合には最高の何を伝えることはできません、

# File_1 
import File_2 
class Main: 
    # ... 
    def modify() 
     self.value = File_2.modify(self.value) 

# File_2 
# !! do NOT import File_1 in this file 
def modify(num): 
    return num + 7 

をしかし、再び、これは一例に過ぎません上記のどちらも)、またはあなたを大いに助けます。

+0

答えをいただきありがとうございます。私は、よりよく説明するために質問を編集しました。 – Adrian

+0

wweはあなたが望むものを補完することができます - そして、あなたの問題が何であるか答えました。 - 周期的なインポートをカットして、あなたのコードも望みどおりに動作します。 – jsbueno

+0

@Adrian:* jsbueno *は正解です。あなたのサイクリックインポートを削除する必要があります。私はいくつかの例を投げて私の答えを編集した(あなたの実際のコードはあなたを助けるのは少し難しい)。 –

関連する問題