装饰器形成的过程
最简单的装饰器----有返回值的----有一个参数----万能参数装饰器的作用:
不想修改函数的调用方式,但是还想再原来的函数前后添加功能#原则:开放封闭原则
开放: 对扩展是开放的
封闭: 对修改是封闭的
语法糖:@装饰器函数名,@timmer等价于func = timmer(func),其中func()是被装饰函数,timmer()就是装饰器函数
最简单的装饰器
import time
def timmer(f):
start = time.time()
f()
end = time.time()
print(end-start)
def func():
time.sleep(0.1)
print('nice!')
timmer(func)
装饰有返回值的装饰器
import time
#timmer()就是装饰器函数,只是对一个函数有装饰作用
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
def inner():
start = time.time()
ret = f() #被装饰的函数
end = time.time()
print(end-start)
return ret
return inner
@timmer #语法糖---@装饰器函数名,等价于func = timmer(func)
def func(): # 被装饰的函数
time.sleep(0.1)
print('nice!')
return 'summertrain'
# func = timmer(func)
result = func()
print(result)
有一个参数
import time
#timmer()就是装饰器函数
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
def inner(a):
start = time.time()
ret = f(a) #被装饰的函数
end = time.time()
print(end-start)
return ret
return inner
@timmer #语法糖---@装饰器函数名,等价于func = timmer(func)
def func(a): # 被装饰的函数
time.sleep(0.1)
print('nice!',a)
return 'summertrain'
# func = timmer(func)
result = func(1)
print(result)
万能参数
#装饰带多个参数,且包括按照位置以及参数传参的装饰器
import time
#timmer()就是装饰器函数
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #被装饰的函数
end = time.time()
print(end-start)
return ret
return inner
@timmer #语法糖---@装饰器函数名,等价于func = timmer(func)
def func(a,b): # 被装饰的函数
time.sleep(0.1)
print('nice!',a,b)
return 'summertrain'
# func = timmer(func)
result = func(1,b=22)
print(result)
装饰器的固定模式
#例子
import time
def wrapper(f): # f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事儿'''
ret = f(*args,**kwargs)
'''在被装饰函数之前要后的事儿'''
return ret
return inner
@wrapper
def func(a,b):
time.sleep(0.1)
print('nice!',a,b)
return 'summertrain'
#减缩版
def wapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
return ret
return inner
@wapper
#qqxing = wapper(qqxing)
def qqxing():
print(1111)
result = qqxing()
装饰器进阶
def wahaha():
print('李白')
print(wahaha,type(wahaha)) # 结果:<function wahaha at 0x00588B70> <class 'function'>
#查看字符串格式的函数名
print(wahaha.__name__,type(wahaha.__name__)) # 结果:wahaha <class 'str'>
from functools import wraps
def wrapper(f):#f=holiday
@wraps(f)
def inner(*args,**kwargs):
print('before')
ret = f(*args,**kwargs)
print('later')
return ret
return inner
@wrapper
def holiday(day):
'''放假通知'''
print('国庆%s天假期'%day)
return '开心'
print(holiday.__doc__)
print(holiday.__name__)
result = holiday(7)
print(result)
执行结果:
放假通知
holiday
before
国庆7天假期
later
开心