您的位置:首页 > 编程语言 > Python开发

python学习之装饰器

2013-03-18 14:07 316 查看
在C/C++中,指针的运用是个高级的话题,我们可以使用指针随意操纵数据对象和内存地址。函数的入口其实也是一个内存地址,为了可以随意地调用函数,需要用到函数指针和回调函数的概念。python中没有指针一说,所有的对象(包括函数)都可以通过引用的方式进行调用。先看下面的例子

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 装饰器