2010-12-19 2 views
5

インポートするモジュールを取得しようとしていますが、特定のクラスのオブジェクトが呼び出された場合のみです。たとえば:Pythonモジュールを1つのクラスにインポートする

class One(object): 
    try: 
     import OneHelper 
    except ImportError: 
     pass 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     # this function does 
     OneHelper.blah() 

これはOne.blah()関数が呼び出されたときNameError: global name 'OneHelper' is not definedの原因となります。今まで私が見つけた唯一のことは、モジュールを実際の関数にインポートすることです。だから、:

class One(object): 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     try: 
      import OneHelper 
     except ImportError: 
      pass 
     # this function does 
     OneHelper.blah() 

しかし、私は、私はそれがクラス全体が利用できるようにしたい、私はそれを使用する各機能モジュールをインポートする必要がありますする必要はありませんが、のみのインスタンスであればそのクラスはインスタンス化されます。私が十分に明確でない場合はお詫び...

+0

インスタンス化されたクラスをインポートし、他の関数内から関数を呼び出すだけの関数を作成してみることもできます。おそらく小さな回避策。 –

答えて

8

import OneHelperは、クラス属性であるため、クラス内で正常に動作します。あなたのクラスを定義した後、dir(One)でこれを確認できます - あなたのOneHelper属性があります。 One.OneHelperはモジュールへの参照です。もちろん、インスタンスでは、メソッドからself.OneHelperという名前でアクセスできます。 (またOne.OneHelperとしてそれにアクセスし続けることができます。)いくつかのプロパティに__init__と属性の

+0

もちろん、今私は愚かな笑を感じる:/洞察力のための感謝! –

+0

愚かではない... 'import'はモジュールのグローバル名前空間に常にインポートすると仮定することは完全に合理的です。それは、それが99.44%の使用で起こるからです。もちろん、それは実際にどのように動作するのではありませんが、それは不合理な出発点ではありません。私はそれがどう動くかを確かめるためにそれを自分自身でテストしなければならなかった。幸いにも、あなたが確信が持てないときは、ちょっとした実験とインスペクションがPythonで長い道のりをつかむでしょう。 – kindall

2

インポート、それを:

class One(object): 
    def __init__(self): 
     try: 
      import OneHelper 
     except ImportError: 
      self.OneHelper = None 
     else: 
      self.OneHelper = OneHelper 
    def blah(self): 
     if self.OneHelper: 
      self.OneHelper.blah() 

をモジュールは、呼び出しのポイントが何であるかをインポートするために失敗した場合ので、あなたの例では、おかしいです後で?

+0

+1例外をキャッチして 'except'ブロックで何もしないことはほとんどありません。ほとんどの場合catchすることはほとんどありません(つまり、ある種のフォールバックがある場合のみ)。 –

0

モジュールをインポートする前にglobal OneHelperを使用することも考えられます。これにより、グローバル名前空間にOneHelperが追加されます。

関連する問題