我目前正在编写某种微型 api 来支持扩展模块类。用户应该能够在配置中写入他们的类名,然后在我们的程序中使用它。约定是,类的模块有一个调用函数create(**kwargs)来返回我们的基本模块类的实例,并放置在一个特殊的文件夹中。但是,一旦动态进行导入,isinstance 检查就会失败。
模块放置在 lib/services/名称中
模块基类(在 lib/services/service 中)
class Service:
    def __init__(self, **kwargs):
        #some initialization
示例模块类(在 lib/services/ping 中)
class PingService(Service):
    def __init__(self, **kwargs):
        Service.__init__(self,**kwargs)
        # uninteresting init
def create(kwargs):
    return PingService(**kwargs)
导入功能
import sys
from lib.services.service import Service
def doimport( clazz, modPart, kw, class_check):
    path = "lib/" + modPart
    sys.path.append(path)
    mod = __import__(clazz)
    item = mod.create(kw)
    if class_check(item):
        print "im happy"
        return item
调用代码
class_check = lambda service: isinstance(service, Service)
s = doimport("ping", "services", {},class_check)
print s
from lib.services.ping import create
pingService = create({})
if isinstance(pingService, Service):
    print "why this?"
我到底做错了什么
这是一个压缩的小示例,只需提取并运行test.py不带参数
zip 示例