首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Patterns事件分派器没有其他if?

Patterns事件分派器没有其他if?
EN

Stack Overflow用户
提问于 2011-03-25 19:21:24
回答 5查看 887关注 0票数 1

我正在为Detour库创建一个Python包装器。该工具的一部分是一个调度器,用于将所有挂钩的API调用发送到各种处理程序。

现在,我的代码如下所示:

代码语言:javascript
复制
if event == 'CreateWindowExW':
    # do something
elif event == 'CreateProcessW':
    # do something
elif ...

这感觉很难看。有没有一种模式可以在不为每个Windows API函数创建elif分支的情况下创建事件分派器?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-25 19:30:53

要做到这一点,一种很好的方法是定义一个类,该类的方法等同于相关的API函数名,再加上一个调度方法,它将调度到正确的方法。例如:

代码语言:javascript
复制
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()
票数 5
EN

Stack Overflow用户

发布于 2011-03-25 19:24:46

这些if最终将不得不去某个地方。为什么不这样做:

代码语言:javascript
复制
handler = get_handler(event)
handler.process()

get_handler中,您可以使用if,每个if都返回一个在process方法中执行其工作的对象。

另一种方法是映射到可调用对象,如下所示:

代码语言:javascript
复制
def react_to_create_window_exw():
   # do something with event here
   pass

handlers = {
  "CreateWindowExW" : react_to_create_window_exw
}

你可以这样使用它:

代码语言:javascript
复制
handler = handlers[event]
handler()

这样,您就不会使用任何if/else条件。

票数 2
EN

Stack Overflow用户

发布于 2011-03-25 19:27:58

您可以使用调度dict方法。

代码语言:javascript
复制
def handle_CreateWindowExW():
    print "CreateWindowExW"     
    #do something

events = {
    "CreateWindowExW": handle_CreateWindowExW
}

events[event]()

这样,您就可以只添加事件,而不必添加不同的if语句。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5431732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档