2016-10-19 4 views
0

こんにちは私は、Cmdモジュールを使ってPythonでネストされたインタプリタを作成したいと考えています。PythonでネストされたCmdインタプリタをインスタンス化する

プロジェクトを簡単に拡張できるようにする(つまり、新しいPythonファイルをフォルダに追加し、メインコードをロードできないようにする)ために動的モジュールの読み込みを設定します。

私の入れ子になったインタプリタは、現在、このような設定である:ネストされたインタプリタを作成するために、私はSubConsoleクラスに2番目の変数としてメインコンソールを渡す必要があるため

def instantiateConsole(base): 

    class SubConsole(cmd.Cmd, base): 
     def __init__(self): 
      cmd.Cmd.__init__(self) 

     def do_action(self,args): 
      print "Action" 
    return SubConsole 

、これが必要です。この問題は、この方法でクラスを作成することができ、このメソッド内で定義を持たずに動的にロードできる新しいコンソールモジュールファイルを追加できなくなることです。

この問題を回避する方法はありますか?

+0

あなたは 'MainConsole'を渡す例を挙げることができますか? –

答えて

0

「MainConsoleを2番目の変数として渡す」と言うと、「新しいSubConsoleをMainConsoleのサブクラスにする」という意味になります。基本クラスを引数とするクラスファクトリを効率的に定義しています。

「このメソッドの内部でクラスを作成する」と言うが、関数内にinstantiateConsoleと表示されます。用語については注意することが重要です。

これは、instantiateClassの引数として使用する可能性のある他の基本クラス(モジュールを含む)の動的インポートとは関係ありません。最も単純なケースでは、これらのモジュールがあなたのsys.pathに存在する標準ディレクトリを追加し、モジュールを名前でインポートしてからベースクラスを抽出することができます(簡略化のために、常にBaseConsoleと定義されます)。基底クラスの名前を変えることができた場合は、その後、(あなたがその名前を決めるだろうか?)

extension_module = importlib.import_module("my_extension") 
new_console = instantiateConsole(extension_module.BaseConsole) 

ようなコードを実行しますあなたが動的にインポートされた拡張モジュールへの簡単な属性アクセスに優先してgetattr()を使用する必要があります。

関連する問題