python全栈学习笔记(十一)装饰器

装饰器

我们执行装饰器是执行里面的内层函数:

 

装饰器也是可以参数的,原函数里有多少参数, 新 指向的函数也有多少参数。
在不改变原来函数执行结果的基础上,我们再添加供能。
 
 
  
     这种方式的传参,可以在不确定原函数有多少参数的情况下使用,*arg收集的是序列返回的是tuple,而**kwargs收集的是dict。
但是在新函数调用的时候如果像下面这个 ret =  func(a1,a2) ,这样需要使用if语句来判断参数。
在python里可以写成
 
 
 
原函数有几个参数,调用的时候就需要写多少个,因为在调用装饰器的时候,需要用到参数的地方,装饰器会找原函数要。 
 
 
 
 
一个函数可以应用多个装饰器
执行顺序是,先执行第一个装饰器,再执行第二个,最后执行原函数
 
多层装饰器的原理:
通过下面的例子,讲解下当一个函数执行多个装饰器的情况:
1、开始我们可以理解成执行一个装饰器(也就是outer),这时index就是outer里的func,而返回值inner就是新的index,而outer实际上也是个函数,我们把outer和index看成一个整体,这样outer的返回值(也就是inner),
作为参数传入第二个装饰器outer_0,这样outer的返回值就是outer_0里的func 。
2、现在我们正向理解:
    1、先执行outer_0装饰器,然后里面的参数func就是装饰器outer的inner,结果就是其return的值,然后outer装饰器里面的func就是原函数index。就是这么个执行顺序。
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def outer_0(func):
def inner(*args,**kwargs):
print('3.5')
        ret = func(*args,**kwargs)
print(ret)
return ret
return inner

def outer(func):
def inner(*args,**kwargs):
print('123')
        ret = func(*args,**kwargs)
print('456')
return ret
return inner

@outer_0
@outer
def index(a1,a2):
print('非常复杂')
return a1 + a2

index(10,100)

执行结果:

3.5
123
非常复杂
456
110

单层装饰器的原理。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2016-06-13 13:30  爬行的龟  阅读(67)  评论(0)    收藏  举报
如有错误,欢迎指正 邮箱656521736@qq.com