1 def outer(func): 2 def inner(): 3 print("hello") 4 print("hello") 5 #func为原f的函数 6 r=func() # r=none 7 print("end") 8 print("rend") 9 return r10 return inner11 @outer #装饰器的本质将原函数封装到新函数,执行outer函数,并县城将其下面的的函数名做为参数传到到12 #传到func中,将outer的返回值重新赋值 给f1=outer的返回值 inner就是地13 #只要应用装饰器,函数就被重新定义,重新定义为inner函数内层的函数14 def f():15 16 print("F1")17 f()
一个装饰器执行过程,先将outer,f函数载入内存,当f()时候就执行@outer,将下面的f当作参数传入outer函数,outer函数中又定义了一个inner函数,执行两个print("hello") 接着执行func()这个其实就是调用原f()函数,将返回值 给r,没有r返回none,接着执行下面
print("end")语句,当inner函数执行完后,面outer返回一个inner函数所在内存指的位置还不是带有括号,否则执行,
内存有三块函数,outer , inner,f分别指不三块内存地址,当执行f()则outer(func)这个时func也指向f 所指的函数,相当于outer(f),执行时返回一个inner所指的函数,这个时候f()则换成inner()执行的函数,而在inner()函数中执行到func()则相当于f()执行,返回的值r接着在执行后面的语句,反回一个r值,其实就是相当于f()返回的值给了r
有参数的1 def outer(func): 2 def inner(a1,a2): 3 print("hello") 4 print("hello") 5 #func为原f的函数 6 r=func(a1,a2) # r=none 7 print("end") 8 print("end") 9 return r10 return inner11 12 13 @outer14 def f1(a1,a2):15 return a1+a216 f1(1,2)
多个参数(有时传一个,传两个,有时传三个)
1 def outer(func): 2 def inner(*args): 3 print("hello") 4 print("hello") 5 #func为原f的函数 6 r=func(*args) # r=none 7 print(r) 8 print("end") 9 print("end")10 return r11 return inner12 @outer13 def f1(a1,a2):14 return a1+a215 f1(1,2)
多个参数,有字典
1 def outer(func): 2 def inner(*args,**kargs): 3 print("hello") 4 print("hello") 5 #func为原f的函数 6 r=func(*args,**kargs) # r=none 7 print(r) 8 print("end") 9 print("end")10 return r11 return inner12 @outer13 def f1(a1,a2):14 return a1+a215 f1(1,2)
多个装饰器加在一个函数
def outer0(func): def inner(*args,**kwargs): print("sbsb") r = func(*args,**kwargs) return r return innerdef outer(func): def inner(*args,**kargs): print("hello") print("hello") #func为原f的函数 r=func(*args,**kargs) # r=none print(r) print("end") print("end") return r return inner@outer0 #先执行第一个装饰器@outer #执行第二个装饰器def f1(a1,a2): return a1+a2f1(1,2)
运行结果
sbsb
hellohello3endend