メソッドにインポートが__init__()
必要です(クラスをインスタンス化するときにのみそのインポートを実行する必要があるため)。
しかし、そのインポートが外部__init__()
に表示されません。スコープはに限定されてい__init__
ますか? 実行する方法?
メソッドにインポートが__init__()
必要です(クラスをインスタンス化するときにのみそのインポートを実行する必要があるため)。
しかし、そのインポートが外部__init__()
に表示されません。スコープはに限定されてい__init__
ますか? 実行する方法?
インポートされた名前は現在のスコープにバインドされるため、関数内のインポートはローカル名のみにバインドされます。
その中に何かをインポートする必要が__init__
あり、グローバルに利用できるようにする必要がある場合は、インポートされた名前をglobal
最初にマークします。
>>> def foo():
... global sys
... import sys
...
>>> sys
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
>>> foo()
>>> sys
<module 'sys' (built-in)>
しかし、これは通常、奇妙で驚くほど見つけにくいバグにつながります。そうしないでください。代わりにモジュールスコープでインポートを行ってください。
他のクラス メソッド内でインポートされた名前が必要な場合は、インポートされた名前をインスタンス変数に割り当てることもできます。
class Foo(object):
def __init__(self):
import os
self.join = os.path.join
ただし、これはベスト プラクティスではありません。
必要な場所に再度インポートするだけで済みます。初回の後にキャッシュされるため、比較的安価です。
または、現在のグローバル名前空間を次のように変更することもできますglobals()['name'] = local_imported_module_name
。
編集:記録のために、関数の使用は確かに機能しますが、他のいくつかの回答が言及しているようにglobals()
、「よりクリーンな」解決策はモジュールの名前を宣言してからglobal
それを宣言することだと思います。import
このimport
ステートメントは、インポートされた名前を現在のスコープでのみ使用できるようにします。import foo
内部のは、メソッド内でのみ表示される を__init__
作成します。foo
__init__
モジュールにアクセスする必要がある任意のメソッドに を追加するかimport foo
、インポートを繰り返し書いていることに気付いた場合は、global
キーワードを使用してモジュール スコープにインポートすることができます。
class Wayne(object):
def __init__(self):
global foo
import foo
インポートの結果をクラスの他のオブジェクトに表示する場合は、インポートの結果のオブジェクトをクラスまたはインスタンス変数に割り当てる必要があります。
例えば:
>>> class Foo(object):
... def __init__(self):
... import math
... self.bar = math.pi
... def zoo(self):
... return self.bar
...
>>> a = Foo()
>>> a.zoo()
3.141592653589793