Python论坛  - 讨论区

标题:[python-chinese] @是什么意思?

2005年11月20日 星期日 01:45

Hong Yuan hongyuan at homemaster.cn
Sun Nov 20 01:45:28 HKT 2005

在一段wxPython的程序中看到如下代码:

    @EVENT(wx.EVT_ERASE_BACKGROUND)
    def OnEraseBackground(self, event):
        pass

请问这个@是什么意思?好像上面这样使用就可以不要使用bind了,程序看起来比 
较清晰。但不知道是怎么做到的。哪位能指点一下?



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月20日 星期日 08:57

limodou limodou at gmail.com
Sun Nov 20 08:57:46 HKT 2005

> 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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月20日 星期日 12:52

shhgs shhgs.efhilt at gmail.com
Sun Nov 20 12:52:37 HKT 2005

每次安装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
>
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月20日 星期日 22:46

Qiangning Hong hongqn at gmail.com
Sun Nov 20 22:46:35 HKT 2005

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


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月21日 星期一 15:54

Hong Yuan hongyuan at homemaster.cn
Mon Nov 21 15:54:12 HKT 2005

仔细研究了一下代码,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


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号