2017-09-02 3 views
1

グローバル変数を取得します。Pythonのインポートモジュールは、私は2つのPythonスクリプト、1 testclass.pyを持って

import numpy 
zz = numpy 

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

と1 testscript.py:私は、エラーをスローするtestscript.pyを期待

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

testscriptはクラスSomething(その__init__メソッドを持つ)だけをインポートし、グローバル変数zzはインポートしないと思っていたからです。だから、このbevahiour与えられた、私の質問は、モジュールからインポートするとき、Pythonモジュールファイル内のすべてを "実行"ですか?

答えて

2

はい。あなたが実行すると:それは同じ効果がある

from testclass import Something 

:より一般的に

import testclass 
Something = testclass.Something 

を(明示的__all__でそれらに名前を付けていない限り)、Pythonインタプリタはあなたのモジュールが公開するオブジェクトどのような事前に知ることができません。極端な場合には、次の点を考慮してください

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

'from import Foo'を複数回実行すると、失敗の可能性が増減しますか?または、定義されたクラスは、最初のインポート後のプロセスで同じままになりますか? –

+0

@ ZachGates:モジュールオブジェクトは、最初に がインポートされた後に 'sys.modules'にキャッシュされます。 – Blender

関連する問題