2016-12-04 55 views
0

我不知道如何進口從進口工作的範圍。請看下面的例子。範圍從進口

我有一個類和我想要一個全局範圍的類的文件中的對象。

# File alpha.py 
class Alpha(): 
    def __init__(self): 
     self.alpha = 0 
    def set(self, value): 
     self.alpha = value 
    def get(self): 
     return self.alpha 

# This is the global variable 
alpha = None 

在另一個文件(control.py)我想訪問到可變阿爾法在文件alpha.py所以我使用:

# File control.py 
from alpha import alpha 
def control(): 
    a = alpha.get() 
    print ('Value of alpha in control ', a) 

在main.py我想使阿爾法的一個實例是這樣的:

# File main.py 
from alpha import Alpha, alpha 
alpha = Alpha() 
alpha.set(1) 
a = alpha.get() 
print ('Value in main: ', a) 

from control import control 
control() 

結果是(顯然阿爾法的範圍是局部的,儘管我從+進口使用):

('Value in main ', 1) 
Traceback (most recent call last): 
    File "main.py", line 13, in <module> 
    main() 
    File "main.py", line 11, in main 
    control() 
    File "control.py", line 4, in control 
    a = alpha.get() 
AttributeError: 'NoneType' object has no attribute 'get' 

但是,如果使用進口與完整的對象路徑它的工作原理:

# File main2.py using simple import 
import alpha 
alpha.alpha = alpha.Alpha() 

alpha.alpha.set(1) 
a = alpha.alpha.get() 
print ('Value in main ', a) 

from control import control 
control() 

調用main2.py的結果是:

('Value in main ', 1) 
('Value of alpha in control ', 1) 

我期待相同的行爲。我在這裏錯過了什麼?

謝謝您的回答

回答

0

[編輯]

這是有關存儲器操作的local variables之間VS module members在Python的差異。

修改代碼來顯示它:

# File alpha.py 
class Alpha(): 
    @staticmethod 
    def getalpha(): 
     global alpha 
     return alpha 
alpha = None 

# File control.py 
from alpha import alpha 
def control(): 
    print("control: ", id(alpha)) 

main.pyinstance將新的存儲器,但不能修改模塊本身。

alpha = Alpha(),alpha(main.py中的局部變量)被創建爲實例Alpha()併爲其分配新的內存。然後,control.py導入原始模塊。

# File main.py 
from alpha import Alpha, alpha 
print("main: ", id(alpha), id(Alpha.getalpha()) 
alpha = Alpha() 
print("main: ", id(alpha), id(Alpha.getalpha())) 

from control import control 
control() 

('main: ', 4530210424, 4530210424) <--- initial value, initial value 
('main: ', 4532198216, 4530210424) <--- <alpha.Alpha>, initial value 
('control: ', 4530210424) <--- get member of original module 

在另一方面,在main2.pymembers of module/class會改變他們的成員值。

alpha.alpha = alpha.Alpha(),alpha.alpha(在main2.py alpha.py的構件)被創建作爲實例的Alpha(),並且它分配新的內存。然後,control.py導入修改後的模塊。

# File main2.py using simple import 
import alpha 
print("main2: ", id(alpha.alpha), id(alpha.Alpha.getalpha())) 
alpha.alpha = alpha.Alpha() 
print("main2: ", id(alpha.alpha), id(alpha.Alpha.getalpha())) 

from control import control 
control() 

('main2: ', 4425401976, 4425401976) <--- initial value, initial value 
('main2: ', 4427402056, 4427402056) <--- <alpha.Alpha>, <alpha.Alpha> 
('control: ', 4427402056) <--- get member of modified module 
+0

謝謝你的回答,但實際上這不是問題。我想要的是能夠擁有由實例化對象的main.py使用的共享對象,以及讀取它的對象control.py。如果你運行的應用程序都應讀取值爲1. –

+0

@ErniTron對不起,誤解,我更新了我的答案,希望它對你有幫助。 –