2013-05-22 105 views

回答

1

下面是我用來從完整課程路徑(例如foo.bar.baz.TheClass)類本身:

def get_class(class_path): 
    module_path, class_name = class_path.rsplit(".", 1) 

    try: 
     module = __import__(module_path, fromlist=[class_name]) 
    except ImportError: 
     raise ValueError("Module '%s' could not be imported" % (module_path,)) 

    try: 
     cls = getattr(module, class_name) 
    except AttributeError: 
     raise ValueError("Module '%s' has no class '%s'" % (module_path, class_name,)) 

    return cls 

用法:

>>> get_class('twisted.internet.nonexistant.Deferred') 

Traceback (most recent call last): 
    File "<pyshell#8>", line 1, in <module> 
    get_class('twisted.internet.nonexistant.Deferred') 
    File "<pyshell#1>", line 7, in get_class 
    raise ValueError("Module '%s' could not be imported" % (module_path,)) 
ValueError: Module 'twisted.internet.nonexistant' could not be imported 
>>> get_class('twisted.internet.defer.NoClass') 

Traceback (most recent call last): 
    File "<pyshell#14>", line 1, in <module> 
    get_class('twisted.internet.defer.NoClass') 
    File "<pyshell#13>", line 12, in get_class 
    raise ValueError("Module '%s' has no class '%s'" % (module_path, class_name,)) 
ValueError: Module 'twisted.internet.defer' has no class 'NoClass' 
>>> get_class('twisted.internet.defer.Deferred') 
<class twisted.internet.defer.Deferred at 0x02B25DE0> 

注意,這不一定返回一個類,它只是返回導入的模塊的屬性:

>>> get_class('twisted.internet') 
<module 'twisted.internet' from 'C:\Python26\lib\site-packages\twisted\internet\__init__.pyc'> 
1

foo.py

class Bar(object): 
    pass 

test.py

from importlib import import_module 

module = import_module('foo') 
BarCls = getattr(module, 'Bar') 
bar = BarCls()