2012-03-01 75 views
0

可以從另一個文件修改實例變量嗎?從另一個文件修改實例變量?

我想要的是從File_2中修改File_1中的實例變量。

例如:

//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" 

這給了我下面的輸出:

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' 

爲什麼?

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不工作是這個「跨進口」你正在嘗試做的 - 當你將這兩個文件導入對方,你有不一致和不希望的副作用。在這種情況下,當main.modify()行在File_1解析中運行時,它在內存中找到尚未完全初始化的「File_2」模塊 - 其中「修改」功能尚不存在。例如,如果您首先導入的文件 - 或作爲主模塊運行的文件是File_2,而不是導入File_2中的文件,則可以使用該文件。第一線,導入它只是修改函數內部,就像這樣:

#File 2 


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

NB這些導入,因爲它們引用了一個已經在解釋器上導入的模塊,只需將已加載的模塊對象綁定到運行範圍中的變量 - 換句話說,Python不會爲模塊執行磁盤訪問文件在每次調用該函數時。

1

您的代碼是充滿循環進口,看看Python: Circular (or cyclic) imports知道我在說什麼。

基本問題是,當編譯器來這行:

File_2.modify() 

File_2不完全加載,menaning編譯器還沒有讀線:

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

自從它被帶回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 

但在你的情況,你必須整個對象(self)傳遞給modify功能,並且僅僅修改一個值是一些浪費。

這將是更好的做一些事情,如:

# 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 2012-03-02 03:45:08

+0

我們可以低估你想要的 - 而且我們都回答了你的問題 - 切斷了循環導入,你的代碼也能正常工作。 – jsbueno 2012-03-02 05:27:40

+0

@Adrian:* jsbueno *是對的,你*有* *刪除你的循環進口。我編輯了我的答案,在那裏拋出了一些例子(沒有你的實際代碼有點難以幫助你)。 – 2012-03-02 11:04:34

相關問題