2011-08-06 4 views
1

私はプラグインのようなモジュールからそのメソッドをインポートするクラスを作ろうとしています。Python;メソッドをクラス 'pluginstyle'にインポートする方法は?

このクラスでは、別のフォルダに格納されているモジュール(つまり 'プラグイン')から関数/変数をインポートできます。これは可能ですか?

私は約__import__()を知っていますが、どのようにしてこのクラスに属するようにインポートすることができますか?これらのモジュールで

plugins/pluginA.py 
plugins/pluginB.py 

私はなどの機能を持っていると私はクラスでそれらをインポートしてアクセスできるようにしたい:

は私が「プラグイン」フォルダに以下のモジュールを持って言うことができます。多分何かのように:

MyClass.pluginA.some_function_from_A() 
MyClass.pluginB.some_function_from_B() 

または多分この

MyClass.some_function_fromA() 
MyClass.some_function_fromB() 

答えて

1

のように、私は二つの部分に問題を破る:機能が含まれるようにクラスを拡張し、その後、モジュールのリストにファイルのリストを回しますそれらのモジュールから。

ブレットキャノンはhow to import a module from just a file pathをカバーしていますので、私はここでそれを複製しません... globモジュールをチェックアウトすることをお勧めします。

第2に、クラスを拡張してプラグインの関数を含める方法。場合...

def extend(obj, plugin_modules): 
    for module in plugin_modules: 
     for export_name in dir(module): 
      export = getattr(module, export_name) 
      if callable(export): 
       setattr(obj, export_name, export) 


class MyClass(object): 
    … code … 

extend(MyClass, plugin_modules) 

しかし、私はMyClassの「プラグイン」機能とまったくネイティブメソッドのように動作しません、それは、これはあなたが望むものであることをそうだということを警告します:私はこのようなものを使用しますあなたがしようとしていることについてより多くの情報を与えたら、私はより有益な答えを出すことができます。

+0

...輸入へselfを渡す方法を見つけ出すことです。ありがとう! – Kanonskall

+0

これらの2つを使って私は答えを見つけたと思うし、私はそれを下に掲示した。再度、感謝します。 – Kanonskall

0

私は試しとGoogleの周り臨検と私はジェシーNollerでデビッドWoleverとThis pageからsetattrgetattについて、先端のおかげで仕事ができるソリューションを作ってみたしてきました。

これまで私がこれまで行ってきたことは、動作しているように見えますが、クリーンアップと微調整が必​​要です。

class MyClass(object): 
    def __init__(self): 
     pass 

    def import_plugins(self): 

     plugins_to_import = [] 
     attribs_to_exclude = ['__builtins__', '__doc__', '__file__', '__name__', '__package__'] 
     plugins = [] 
     plugins_dir = './plugins' 

     # add the plugins directory to path 
     if os.path.isdir(plugins_dir): 
      sys.path.append(plugins_dir) 
     else: 
      print '%s is not a directory!' % (plugins_dir) 

     # make a list of the plugins to import 
     for plugin_file in os.listdir(os.path.abspath(plugins_dir)): 
      #print plugin_file 
      plugin_file_name, plugin_file_extension = os.path.splitext(plugin_file) 
      if plugin_file_extension == '.py': 
       plugins_to_import.append(plugin_file_name) 

     # import the plugins to a list 
     for plugin in plugins_to_import: 
      plugins.append(__import__(plugin)) 

     # add the attributes to self 
     for plugin in plugins: 
      for attribute in dir(plugin): 
       if attribute not in attribs_to_exclude: 
        self.__setattr__(attribute, getattr(plugin, attribute)) 

一つの問題は、今、私は `getattr`と` setattr`が良い手がかりことができると思い

関連する問題