Python论坛  - 讨论区

标题:[python-chinese] 关于内嵌方式的问题

2005年09月24日 星期六 22:51

wang bin wangbin1979 at gmail.com
Sat Sep 24 22:51:52 HKT 2005

def printBeginEnd(fn):
    def _printBeginEnd(self):
        print "%s begins!" %fn.__name__
        result = fn(self)
        print "%s ends!" %fn.__name__
        return result
    return _printBeginEnd

class foobar:
    def foo(self):
        #print "foo"
        return 'foo'
    foo = printBeginEnd(foo)

if __name__=='__main__':
    f1 = foobar()
    print f1.foo()

foo = printBeginEnd(foo)这句和foo()函数的关系是什么啊?为什么程序执行的结果会是下面这样那:
foo begins!
foo ends!
foo
--
想飞之心,永远不死!

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

2005年09月24日 星期六 23:02

limodou limodou at gmail.com
Sat Sep 24 23:02:45 HKT 2005

在 05-9-24,wang bin<wangbin1979 at gmail.com> 写道:
> def printBeginEnd(fn):
>     def _printBeginEnd(self):
>         print "%s begins!" %fn.__name__
>         result = fn(self)
>         print "%s ends!" %fn.__name__
>         return result
>     return _printBeginEnd
>
> class foobar:
>     def foo(self):
>         #print "foo"
>         return 'foo'
>     foo = printBeginEnd(foo)
>
> if __name__=='__main__':
>     f1 = foobar()
>     print f1.foo()
>
> foo = printBeginEnd(foo)这句和foo()函数的关系是什么啊?为什么程序执行的结果会是下面这样那:
> foo begins!
> foo ends!
> foo

在python 2.4中这种处理已经有标准的语法支持叫decorator,用这种语法写的话printBeginEnd不用变,只是把类中的写法改为:

 class foobar:
     @printBeginEnd
     def foo(self):
         #print "foo"
         return 'foo'

关于decorator,它的主要作用就是对类的方法进行预处理,如上面就是使用printBeginEnd对foo函数进行了特殊处理,这个printBeginEnd将返回一个新函数,然后再赋给foo,因此decorator的语法其实就是:

foo = printBeginEnd(foo)

那么在处理之后foo已经是另一个新函数了。这样的好处是当你对原函数进行修改后,不用直接修改原函数而是通过decorator的处理,创建一个新函数作一些特殊处理,在这个新函数中可以调也可以不调原函数。而且decorator对于函数的参数还有几种变化可以看一看相应的文档。

--
I like python!
My Donews Blog: http://www.donews.net/limodou

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

2005年09月25日 星期日 17:49

ajax chelsea ajaxchelsea at gmail.com
Sun Sep 25 17:49:35 HKT 2005

这难道就是Python中的AOP?

在05-9-24,limodou <limodou at gmail.com> 写道:
>
> 在 05-9-24,wang bin<wangbin1979 at gmail.com> 写道:
> > def printBeginEnd(fn):
> > def _printBeginEnd(self):
> > print "%s begins!" %fn.__name__
> > result = fn(self)
> > print "%s ends!" %fn.__name__
> > return result
> > return _printBeginEnd
> >
> > class foobar:
> > def foo(self):
> > #print "foo"
> > return 'foo'
> > foo = printBeginEnd(foo)
> >
> > if __name__=='__main__':
> > f1 = foobar()
> > print f1.foo()
> >
> > foo = printBeginEnd(foo)这句和foo()函数的关系是什么啊?为什么程序执行的结果会是下面这样那:
> > foo begins!
> > foo ends!
> > foo
>
> 在python 2.4中这种处理已经有标准的语法支持叫decorator,用这种语法写的话printBeginEnd不用变,只是把类中的写法改为:
>
> class foobar:
> @printBeginEnd
> def foo(self):
> #print "foo"
> return 'foo'
>
>
> 关于decorator,它的主要作用就是对类的方法进行预处理,如上面就是使用printBeginEnd对foo函数进行了特殊处理,这个printBeginEnd将返回一个新函数,然后再赋给foo,因此decorator的语法其实就是:
>
> foo = printBeginEnd(foo)
>
>
> 那么在处理之后foo已经是另一个新函数了。这样的好处是当你对原函数进行修改后,不用直接修改原函数而是通过decorator的处理,创建一个新函数作一些特殊处理,在这个新函数中可以调也可以不调原函数。而且decorator对于函数的参数还有几种变化可以看一看相应的文档。
>
> --
> I like python!
> My Donews Blog: http://www.donews.net/limodou
>
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050925/e1ce3390/attachment.html

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

2005年09月25日 星期日 19:12

limodou limodou at gmail.com
Sun Sep 25 19:12:09 HKT 2005

在 05-9-25,ajax chelsea<ajaxchelsea at gmail.com> 写道:
> 这难道就是Python中的AOP?

不是AOP。

--
I like python!
My Donews Blog: http://www.donews.net/limodou

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号