我正在为Detour库创建一个Python包装器。该工具的一部分是一个调度器,用于将所有挂钩的API调用发送到各种处理程序。
现在,我的代码如下所示:
if event == 'CreateWindowExW':
# do something
elif event == 'CreateProcessW':
# do something
elif ...这感觉很难看。有没有一种模式可以在不为每个Windows API函数创建elif分支的情况下创建事件分派器?
发布于 2011-03-25 19:30:53
要做到这一点,一种很好的方法是定义一个类,该类的方法等同于相关的API函数名,再加上一个调度方法,它将调度到正确的方法。例如:
class ApiDispatcher(object):
def handle_CreateWindowExW(self):
# do whatever
def handle_CreateProcessW(self):
# do this one
def dispatch(self, event):
method = getattr(self, 'handle_%s' % event)
method()发布于 2011-03-25 19:24:46
这些if最终将不得不去某个地方。为什么不这样做:
handler = get_handler(event)
handler.process()在get_handler中,您可以使用if,每个if都返回一个在process方法中执行其工作的对象。
另一种方法是映射到可调用对象,如下所示:
def react_to_create_window_exw():
# do something with event here
pass
handlers = {
"CreateWindowExW" : react_to_create_window_exw
}你可以这样使用它:
handler = handlers[event]
handler()这样,您就不会使用任何if/else条件。
发布于 2011-03-25 19:27:58
您可以使用调度dict方法。
def handle_CreateWindowExW():
print "CreateWindowExW"
#do something
events = {
"CreateWindowExW": handle_CreateWindowExW
}
events[event]()这样,您就可以只添加事件,而不必添加不同的if语句。
https://stackoverflow.com/questions/5431732
复制相似问题