选择要在python中动态加载的类

时间:2017-03-30 09:37:51

标签: python

事件映射器程序根据事件键属性接收事件流。处理该事件需要特定的处理程序类。

我的要求是我希望以后能够添加新的事件处理程序,而无需重新启动事件映射器程序。

我能够动态加载特定的事件处理程序类。

def loadClass(self,module,file_name,class_name):
    try:
        worker_module = getattr(__import__(module+'.'+file_name),file_name)
        return getattr(worker_module, class_name)
    except Exception as e: 
        print e
        return None

我需要事件键属性与特定modulefile_nameclass_name

之间的映射

我正在考虑使用此映射信息将映射保存在单独的文件中,并将其读取以映射每个事件,但我希望有更好的方法。

2 个答案:

答案 0 :(得分:0)

在java中,我们尝试使用forname获取类的名称,并使用newInstance进行类的动态instanciation,如下所示:

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

在python中尝试查看此网址Does python have an equivalent to Java Class.forName()?

答案 1 :(得分:0)

你正在寻找dict吗?我不太确定你的工作流程是什么(也许是明确的),但我理解的是:
事件 - &gt; HandlerMapper读取event.key - &gt;调用正确的HandlerClass(事件)

这正是字典所做的:

#definition
handlers=dict()
handleEvent(event):
    if event.key in handlers:
        return handlers[event.key](event)
    else:
        #do magic to load class as HandlerClass
        handlers[event.key] = HandlerClass
        return handlers[event.key](event)

我不明白为什么你需要这个装载魔法。要添加新的处理程序,只需在加载后添加该类(即调用handler['key_of_new_event'] = NewHandlerClass