简单的装饰器举例
def wrapper(f): # 装饰器函数
def inner(*args,**kwargs):
print('在函数执行前')
ret = f(*args,**kwargs) # 被装饰的函数
print('在函数执行后')
return ret
return inner
@wrapper # @ 语法糖 ,@装饰器函数名
def func(a,b):# 被装饰的函数
print(f'{a}+{b}={a+b}')
# 被装饰器装饰后,函数名 func = wrapper(func) = inner
result = func(1,2)# result = func(1,2) = inner(1,2)
装饰器的作用
不想修改函数的调用方式 但是还想在原来的函数前后添加功能。timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
原则
开放封闭原则:
对扩展是开放的,对修改是封闭的。
本质
装饰器的本质 : 闭包函数
函数名的两个内建函数
def wahaha():
'''
一个打印娃哈哈的函数
:return:
'''
print('娃哈哈')
print(wahaha.__name__) #查看字符串格式的函数名 # wahaha
print(wahaha.__doc__)
#document
#一个打印娃哈哈的函数
# :return:
多个装饰器装饰同一个函数
#多个装饰器装饰一个函数
def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
ret = func()
print('wrapper1 ,after func')
return ret
return inner1
def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
ret = func()
print('wrapper2 ,after func')
return ret
return inner2
def wrapper3(func):
def inner3():
print('wrapper3 ,before func')
ret = func()
print('wrapper3 ,after func')
return ret
return inner3
@wrapper3
@wrapper2
@wrapper1
def f():
print('in f')
return '哈哈哈'
print(f())
使用场景
记录用户的登录情况、、、计算这个函数的执行时间