9

メソッドにインポートが__init__()必要です(クラスをインスタンス化するときにのみそのインポートを実行する必要があるため)。

しかし、そのインポートが外部__init__()に表示されません。スコープはに限定されてい__init__ますか? 実行する方法?

4

4 に答える 4

9

インポートされた名前は現在のスコープにバインドされるため、関数内のインポートはローカル名のみにバインドされます。

その中に何かをインポートする必要__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

ただし、これはベスト プラクティスではありません。

于 2012-11-15T10:09:11.857 に答える
5

必要な場所に再度インポートするだけで済みます。初回の後にキャッシュされるため、比較的安価です。

または、現在のグローバル名前空間を次のように変更することもできますglobals()['name'] = local_imported_module_name

編集:記録のために、関数の使用は確かに機能しますが、他のいくつかの回答が言及しているようにglobals()、「よりクリーンな」解決策はモジュールの名前を宣言してからglobalそれを宣言することだと思います。import

于 2012-11-15T10:07:19.290 に答える
4

このimportステートメントは、インポートされた名前を現在のスコープでのみ使用できるようにします。import foo内部のは、メソッド内でのみ表示される を__init__作成します。foo__init__

モジュールにアクセスする必要がある任意のメソッドに を追加するかimport foo、インポートを繰り返し書いていることに気付いた場合は、globalキーワードを使用してモジュール スコープにインポートすることができます。

class Wayne(object):
    def __init__(self):
        global foo
        import foo
于 2012-11-15T10:09:57.403 に答える
3

インポートの結果をクラスの他のオブジェクトに表示する場合は、インポートの結果のオブジェクトをクラスまたはインスタンス変数に割り当てる必要があります。

例えば:

>>> class Foo(object):
...    def __init__(self):
...       import math
...       self.bar = math.pi
...    def zoo(self):
...       return self.bar
... 
>>> a = Foo()
>>> a.zoo()
3.141592653589793
于 2012-11-15T10:09:47.643 に答える