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

选择要在python中动态加载的类,python,Python,事件映射程序根据事件键属性接收事件流。处理该事件需要特定的处理程序类 我的要求是,我希望将来能够添加新的事件处理程序,而无需重新启动事件映射程序 我能够动态加载特定的事件处理程序类 def loadClass(self,module,file_name,class_name): try: worker_module = getattr(__import__(module+'.'+file_name),file_name) return getattr(wo

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

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

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

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
我需要事件键属性与特定的
模块
文件名
类名


我正在考虑使用此映射信息在一个单独的文件中维护映射,并阅读该文件以映射每个事件,但我希望有更好的方法。

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

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

在python中尝试查看此url是否可能是您正在查找的
dict
s?我不太确定你的工作流程是什么(可能会弄清楚),但我的理解是:
事件->HandlerMapper读取event.key->调用正确的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\u of_new\u event']=NewHandlerClass

我在我的
loadClass
函数中也做了同样的事情。我要查找的工作流与您的代码完全相同。但是
#do magic
部分很复杂,因为假设事件处理程序永远不会结束,在dict中维护映射是不可能的,因为您不能在稍后的时间点更改映射(这就是我在文件中维护映射的原因),但我确信有更好的方法。还有一个问题是,由中的程序导入的类不会在重复导入时再次解释,因此,一旦事件处理程序读取该类,事件处理程序类中的更改就会反映在事件处理程序中。我仍然不确定是否理解。问题是,一旦类被加载,它可能会改变,并且必须在以后重新加载?在这种情况下,为每个处理程序创建一个超时线程,以便在一定时间后再次删除它?