2017-09-02 88 views
1

我有兩個Python腳本,一個testclass.py:的Python - 導入模塊得到全局變量

import numpy 
zz = numpy 

class Something(object): 
    def __init__(self): 
     self.xp = zz 

和一個testscript.py:

from testclass import Something 
x = Something() 
print(x.xp) 

我預計testscript.py拋出一個錯誤因爲我認爲testscript只導入類Something(使用其方法__init__),而不是全局變量zz。所以,考慮到這個問題,我的問題是,從模塊導入時,Python是否會「運行」模塊文件中的所有內容?

回答

2

是的。當您執行:

from testclass import Something 

它具有相同的效果:

import testclass 
Something = testclass.Something 

更一般地,Python解釋器無法事先知道哪些對象的模塊自曝(除非你明確他們的名字在__all__) 。對於極端的情況下,考慮以下因素:

a.py

import random 

if random.random() > 0.5: 
    class Foo(object): 
     pass 
else: 
    class Bar(object): 
     pass 

運行from a import Foo有失敗,因爲a模塊對象可能會或可能不會有Foo屬性的機率爲50%。

+0

我喜歡在項目中的深層模塊中定義隨機東西的想法。最好保持相同的名字,但是不同的MRO,會讓人倍感樂趣。 – spectras

+0

多次執行'從一個導入Foo'增加/減少失敗的機率?或者,在第一次導入後的過程中,定義的類是否保持不變? –

+0

@ZachGates:在導入第一個 之後,模塊對象被緩存在「sys.modules」中。 – Blender