2011-11-14 9 views
0

私のPythonアプリケーションでは、いくつかのテキストのパーサを含む40個のモジュール(クラス)があります。私の機能では、特定のモジュールをインスタンス化して使用したいだけです。これらはすべてデータベース内でソートされます。あなたが実際にPythonでこれを行うにはどうすればよいクラスインスタンスを動的にインポートして作成する

私は私が私のパーサを知っている今の時点で、と私は、インポートし、しかし

作成したいPythonのファイル名とクラスの両方を持っている......?

;

file_name = 'lex_parser' 
class_name = 'LexParser' 

私はどのように行うことができます....

from {file_name} import {class_name} 
Parser = {class_name}() 

は、私が何を意味するか従ってください?このようなものについて

答えて

5

はこれを試してみてください。

__import__が最上位パッケージを返すため、モジュールがパッケージ内にある場合はこれは機能しません。

import sys 

file_name = 'parsers.lex_parser' 
class_name = 'LexParser' 

__import__(file_name) 
Parser = getattr(sys.modules[file_name], class_name) 

これは、両方のケースで動作し、__import__機能documentationによって推奨事項を、されています。その場合、あなたはこれを行うことができます。両方の例で

Parserはあなたのように正常にインスタンス化する必要がクラスである:

parser = Parser() 
3

方法:file_name.pyを含んではならないということ

file_name = 'lex_parser' 
class_name = 'LexParser' 

Parser = getattr(__import__(file_name), class_name) 

注:

module = __import__('my_module') 
if hasattr(module, 'ClassName'): 
    ClassName = module.ClassName 
    my_object = ClassName() 
+0

は有望に見える、しかし私は のClassName = module.ClassName はAttributeError 、取得「モジュール」オブジェクト 'には属性がありませんClassName ' – Wizzard

+1

@ Wizzard私が書いた識別子は単なる例であり、 'getattr'を使ってクラスを取得しなければならないかもしれません。 –

関連する問題