1

私はこのように設定されたパッケージの実装を検討しています:

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...

これらは、示されているように印刷されたり、エラーが発生したりする可能性があります。アプリ固有のモジュールは、_generic.WordProcから派生したWordProcクラスを含む_generic.pyのコピーになります。このようにして、機能は時間の経過とともに繰り返し実装され、実装されていないものに関するメッセージは単にアラートを生成します。

__init __。pyは、使用するモジュールを特定するために、次のものを(順番にリストして)検索できると想像しています。

  1. wordprocモジュール変数
  2. パス内の設定ファイル
  3. wordproc環境変数
  4. 環境を判別しようとする関数
  5. __init __。pyのデフォルト(おそらく_generic.py)

3は各アプリのモジュールの関数であるか、これらは特別に名前が付けられた環境テストスクリプト(例:env.py)を含むフォルダーに入れられ、__init__。pyがそれらをループする可能性があると思います。

次に、wordprocを使用してこれを簡単に実行できるようにしたいライブラリが必要です。

import wordproc as wp

wp.createNewDoc()
etc...

私が知らないのは、__init__。pyによって決定された適切なモジュールの適切なクラスにwpを解決させる方法です。これを行うのは意味がありません:

import wordproc.gedit as wp

これにより、wordprocのどのモジュールを使用するかを__init__。pyに決定させるという点が失われます。クラス継承のようなものが必要ですが、モジュールレベルです。

4

1 に答える 1

2

__init__.py次のように書くことで、希望する効果を得ることができます。

  1. 最初に適切なモジュールをインポートします。動的インポートのヘルプについては、importlib.import_moduleまたはのpythonドキュメントを参照してください。__import__
  2. メソッドをエクスポートするクラスをインスタンス化します
  3. インスタンスメソッドをlocals()に割り当てます
# 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)
于 2012-04-22T04:37:55.740 に答える