事件映射器程序根据事件键属性接收事件流。处理该事件需要特定的处理程序类。
我的要求是我希望以后能够添加新的事件处理程序,而无需重新启动事件映射器程序。
我能够动态加载特定的事件处理程序类。
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
我需要事件键属性与特定module
,file_name
和class_name
我正在考虑使用此映射信息将映射保存在单独的文件中,并将其读取以映射每个事件,但我希望有更好的方法。
答案 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
)