2012-04-22 4 views
1

Python - クラスはモジュールのように動作できますか?私はこのようなセットアップパッケージの実装検討している

wordproc 
    __init__.py 
    _generic.py 
    gedit.py 
    oofice.py 
    word.py 

を_generic.pyは、このようなクラスを持っているでしょう:

class WordProc (object): 

    def __init__ (self): 
     pass 

    def createNewDoc (self): 
     print "createNewDoc unimplemented in current interface" 

    def getWordCount (self): 
     print "getWordCount unimplemented in current interface" 

    etc... 

これらが示すように、プリントアウト、またはエラーを上げることができます。 App固有のモジュールは_generic.WordProcから派生したWordProcクラスで_generic.pyのコピーにすぎません。このようにして、実装されていないものについてのメッセージでアラートを発生させるだけで、機能が繰り返し実行される可能性があります。

私は__init__.pyを使用するモジュールを把握する(順)以下のものを見ることができることを想像しています:

  1. wordprocモジュール変数
  2. パスの設定ファイル
  3. 変数wordproc環境環境
  4. __init__.pyでデフォルト(おそらく_generic.py)を決定しようとする機能

私は3が各アプリケーションモジュールの関数である可能性があると思います。または、これらは特に名前付き環境テストスクリプト(例: env.py)、__init__.pyがそれらをループする可能性があります。私は単にこれを行うことができるようにwordprocを使用する任意のライブラリで、その後たい

import wordproc as wp 

wp.createNewDoc() 
etc... 

私が知らない何かをして適切なクラスに解決WP持ってする方法です__init__.pyによって決定される適切なモジュール。

import wordproc.gedit as wp 

これは、__init__.pyが使用するwordprocのモジュールを決定する点を破壊します。私はクラス継承のようなものが必要ですが、モジュールレベルで必要です。

答えて

2

あなたはこのよう__init__.pyを書き込むことによって、あなたの所望の効果を達成することができます

  1. は、最初に適切なモジュールをインポートします。動的インポートに関するヘルプについては、importlib.import_moduleまたは__import__のpythonドキュメントを参照してください。
  2. は、あなたが地元の人々にインスタンスメソッドを割り当てる方法
  3. をエクスポートするクラス()
# import appropriate module as mod depending on settings, environment 
# using importlib.import_module, or __import__ 

__all__ = [] 

_instance = mod.WordProc() 
for attr in dir(_instance): 
    if not attr.startswith('_') and callable(getattr(_instance, attr)): 
     locals()[attr] = getattr(_instance, attr) 
+0

感謝、イムランをインスタンス化します。私はこれが私のために働くと思う。 –

関連する問題