python学习之装饰器

随声附和 提交于 2021-01-09 12:38:29
在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下好了,我讲的也不会很正确,当然装饰器的实用价值是很高的,大家可以慢慢发掘。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!