python学习之装饰器
2013-03-18 14:07
316 查看
在C/C++中,指针的运用是个高级的话题,我们可以使用指针随意操纵数据对象和内存地址。函数的入口其实也是一个内存地址,为了可以随意地调用函数,需要用到函数指针和回调函数的概念。python中没有指针一说,所有的对象(包括函数)都可以通过引用的方式进行调用。先看下面的例子
当我们把foo赋值给bar时,bar和foo其实引用了同一个函数对象,这是就可以以调用foo()的方式调用bar()了。不过需要注意的是,foo是函数对象的引用,而foo()是函数对象的调用。再看下面的例子
这种用法是不是让你想起了C/C++中的函数指针的用法,确实很像,实际上它也实现了类似的功能。闲话讲了很多,那么装饰器该正式登场了,其实装饰器的语法糖类似于
bar=foo(bar),只不过它简化了表现形式。
上面这种情况下,被装饰的函数只在开始时调用了一次(如this is foo只调用了一次)。
为了让装饰器带上参数,且不调用被装饰的函数,还需要对函数做简单的修改,加入内嵌包装函数使得形参和返回值都与原函数一致
这样看是不是更好了啊,函数加上了参数后还是返回正确值,不过有一点变了,不知道发现没有:
这句话没有输出了,也就是说函数屏蔽了此句的首次输出。
上面这个例子是让装饰器带上参数,是不是很奇妙啊,其实装饰器还有很多用处,如多个装饰器,类的静态方法,这里就不一一解释了,我觉得还是自己动手实践才会对装饰器了解得更深入些,我其实也是一知半解,不过已经够用了。更高深的用法大家google下好了,我讲的也不会很正确,当然装饰器的实用价值是很高的,大家可以慢慢发掘。
def foo(): print 'this foo()' bar=foo bar()
this foo()
当我们把foo赋值给bar时,bar和foo其实引用了同一个函数对象,这是就可以以调用foo()的方式调用bar()了。不过需要注意的是,foo是函数对象的引用,而foo()是函数对象的调用。再看下面的例子
def foo(func): print 'this foo' return func def bar(): print 'this bar' bar=foo(bar) bar()
this foo this bar
这种用法是不是让你想起了C/C++中的函数指针的用法,确实很像,实际上它也实现了类似的功能。闲话讲了很多,那么装饰器该正式登场了,其实装饰器的语法糖类似于
bar=foo(bar),只不过它简化了表现形式。
def foo(func): print 'this foo' return func @foo def bar(): print 'this bar' bar() bar()
this foo this bar
this bar
上面这种情况下,被装饰的函数只在开始时调用了一次(如this is foo只调用了一次)。
为了让装饰器带上参数,且不调用被装饰的函数,还需要对函数做简单的修改,加入内嵌包装函数使得形参和返回值都与原函数一致
def foo(func): def _foo(a,b): print 'this foo',a+b return func #这里可以不需要返回func return _foo @foo def bar(c,d): print 'this bar',c+d bar(1,2)
this foo 3
这样看是不是更好了啊,函数加上了参数后还是返回正确值,不过有一点变了,不知道发现没有:
print 'this bar',c+d
这句话没有输出了,也就是说函数屏蔽了此句的首次输出。
def foo(arg): def _foo(func): def _foo1(): print 'the func is:%s ,the model is:%s' % (func.__name__,arg) return _foo1 return _foo @foo('this model') def bar(): print 'this bar' bar()
上面这个例子是让装饰器带上参数,是不是很奇妙啊,其实装饰器还有很多用处,如多个装饰器,类的静态方法,这里就不一一解释了,我觉得还是自己动手实践才会对装饰器了解得更深入些,我其实也是一知半解,不过已经够用了。更高深的用法大家google下好了,我讲的也不会很正确,当然装饰器的实用价值是很高的,大家可以慢慢发掘。
相关文章推荐
- Python学习7:装饰器
- Python学习日志之二-----装饰器
- python学习:装饰器,*args **kwargs
- 【Python】学习笔记——-5.4、装饰器
- Python装饰器学习笔记
- [Python]学习装饰器语法
- Python 学习笔记9(装饰器,decorator)
- Python教程学习简记11--Python decorator 装饰器
- Python学习--装饰器
- python深入学习--decorator强大的装饰器
- Python 学习 - 装饰器
- python学习之路 六 :装饰器
- Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
- python 学习笔记---匿名函数 装饰器 偏函数
- python学习系列之python装饰器基础(2)---装饰含返回值的函数
- Python 装饰器学习以及实际使用场景实践
- python开发学习-day04(迭代器、生成器、装饰器、二分查找、正则)
- 流畅的python学习笔记第七章:装饰器
- python学习笔记:装饰器2
- Python学习---第5天---装饰器