2005年11月20日 星期日 01:45
在一段wxPython的程序中看到如下代码: @EVENT(wx.EVT_ERASE_BACKGROUND) def OnEraseBackground(self, event): pass 请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 较清晰。但不知道是怎么做到的。哪位能指点一下?
2005年11月20日 星期日 08:57
> 2005/11/20, Hong Yuan <hongyuan at homemaster.cn>: > 在一段wxPython的程序中看到如下代码: > > @EVENT(wx.EVT_ERASE_BACKGROUND) > def OnEraseBackground(self, event): > pass > > 请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 > 较清晰。但不知道是怎么做到的。哪位能指点一下? @是2.4中新增的功能,叫decorator,你可以查一查我以前写的blog,有关于decorator.它的作用就是对下面的函数进行处理,返回一个函数,也可能是一个新函数。 @a def b():pass 相当于执行了: b = a(b) 也就是a是一个decorator,它的一个参数是一个函数,a处理完b后返回一个新函数返回,但仍然赋值给b,这样b这个函数还存在,但有可能是一个新函数。也可以是原来的函数。这要看在a中如何处理了。 上面a这个函数还需要定义,如: def a(f): return f 这是不作任何处理 def a(f): def m(): return return m 返回了一个新函数。 还有许多其它的玩吧。自已查一查吧。 -- I like python! My Blog: http://www.donews.net/limodou NewEdit Maillist: http://groups.google.com/group/NewEdit
2005年11月20日 星期日 12:52
每次安装Python的时候都会带一份文档,文档里的what'snew是必看的。 On 11/19/05, limodou <limodou at gmail.com> wrote: > > 2005/11/20, Hong Yuan <hongyuan at homemaster.cn>: > > 在一段wxPython的程序中看到如下代码: > > > > @EVENT(wx.EVT_ERASE_BACKGROUND) > > def OnEraseBackground(self, event): > > pass > > > > 请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 > > 较清晰。但不知道是怎么做到的。哪位能指点一下? > > @是2.4中新增的功能,叫decorator,你可以查一查我以前写的blog,有关于decorator.它的作用就是对下面的函数进行处理,返回一个函数,也可能是一个新函数。 > > @a > def b():pass > > 相当于执行了: > > b = a(b) > > 也就是a是一个decorator,它的一个参数是一个函数,a处理完b后返回一个新函数返回,但仍然赋值给b,这样b这个函数还存在,但有可能是一个新函数。也可以是原来的函数。这要看在a中如何处理了。 > > 上面a这个函数还需要定义,如: > > def a(f): > return f > 这是不作任何处理 > > def a(f): > def m(): > return > return m > 返回了一个新函数。 > > 还有许多其它的玩吧。自已查一查吧。 > -- > I like python! > My Blog: http://www.donews.net/limodou > NewEdit Maillist: http://groups.google.com/group/NewEdit > > _______________________________________________ > Python中文技术讨论邮件列表 > 发言: 发邮件到 python-chinese at lists.python.cn > 订阅: 发送 subscribe 到 python-chinese-request at lists.python.cn > 退订: 发送 unsubscribe 到 python-chinese-request at lists.python.cn > 详细说明: http://python.cn/mailman/listinfo/python-chinese > >
2005年11月20日 星期日 22:46
Hong Yuan wrote: > 在一段wxPython的程序中看到如下代码: > > @EVENT(wx.EVT_ERASE_BACKGROUND) > def OnEraseBackground(self, event): > pass > > 请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 > 较清晰。但不知道是怎么做到的。哪位能指点一下? 能不能贴一下这个EVENT的实现?decorator应该是在类定义的时候执行吧,这个时 候控件的实例还没有生成,怎么调用Bind呢?感兴趣。 -- Qiangning Hong, Registered Linux User #396996 My Blog: http://www.hn.org/hongqn RSS: http://feeds.feedburner.com/hongqn
2005年11月21日 星期一 15:54
仔细研究了一下代码,EVENT的和另一个辅助函数的定义如下: def EVENT(event, source=None, id=-1, id2=-1): def func(f): if not hasattr(f,'wxevent'): f.wxevent=[] f.wxevent.append((event, source, id, id2)) return f return func def MapWXEvents(eventhandler): for funcname in dir(eventhandler): func = getattr(eventhandler, funcname) if hasattr(func, 'wxevent'): for e in func.wxevent: event, source, id, id2 = e eventhandler.Bind(event, func, source, id, id2) 在GUI类中可以使用EVENT decorator比较直观地绑定事件及其处理函数。在 __init__时调用MapWXEvents进行Bind。 class MyFrame(wx.Frame): def __init__(self): ... some init code ... MapWXEvents(self) @EVENT(wx.EVT_ERASE_BACKGROUND) def OnEraseBackground(self, event): pass Qiangning Hong wrote: >Hong Yuan wrote: > > >>在一段wxPython的程序中看到如下代码: >> >> @EVENT(wx.EVT_ERASE_BACKGROUND) >> def OnEraseBackground(self, event): >> pass >> >>请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 >>较清晰。但不知道是怎么做到的。哪位能指点一下? >> >> > >能不能贴一下这个EVENT的实现?decorator应该是在类定义的时候执行吧,这个时 >候控件的实例还没有生成,怎么调用Bind呢?感兴趣。 > > > > -- HONG Yuan 大管家网上建材超市 http://www.homemaster.cn Tel: 021-50941728 Fax: 021-50941727
Zeuux © 2025
京ICP备05028076号