python wraps 装饰器进阶 带参数的,多个装饰一个

一、wraps

from functools import wraps #第一句

def wrapper(func):
@wraps(func) #第二名
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事情')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事情')
return ret
return inner

@wrapper
def holiday(day):
print('全体放假%s天'%day)
return '好开心'

print(holiday.__name__) #加上上面两句才能在这里打印出holiday的字符串名
ret = holiday(3)
print(ret)

# def wahaha():
# '''
# 一个打印娃哈哈的函数
# :return:
# '''
# print('娃哈哈')
#
# print(wahaha.__name__) #查看字符串的函数名
# print(wahaha.__doc__) #document
# print(wahaha.__dir__())



二、装饰器进阶
# 带参数的装饰器
# 三层函数
"""
import time
FLAG = True
def timmer_out(flag):
def timmer(func):
def inner(*args,**keargs):
if flag:
start = time.time()
ret = func(*args, **keargs)
end = time.time()
print(end - start)
return ret
else:
ret = func(*args,**keargs)
return ret
return inner
return timmer

@timmer_out(FLAG) #这句相当于先执行timmer(FLAG),返回timmer和@连起来去执行@timmer,加个传参数的功能
def wahaha():
time.sleep(0.01)
print('wahahahah')
@timmer_out(FLAG)
def erguotou():
time.sleep(0.01)
print('erguotoutoutou')

wahaha()
erguotou()

"""

 



# 多个装饰器装饰一个函数

def wrapper1(func): #func --> f
def inner1():
print('wrapper1,before func')
func() #f
print('wrapper1,after func')
return inner1

def wrapper2(func): #func--->inner1
def inner2():
print('wrapper2,before func')
func() #inner1
print('wrapper2,after func')
return inner2

# 俄罗斯套娃方式 这里再加一个也是一样的
@wrapper2 #f = wrapper2(f) --->wrapper2(inner1) =inner2
@wrapper1 #f = wrapper1(f) = inner1
def f():
print('in f')
return

f()



 






posted @ 2019-08-01 16:35  休由  阅读(945)  评论(0编辑  收藏  举报