装饰器:可以在不改变原来代码的基础上,给函数添加新的功能
# 装饰器函数
def wrapper(f):
def inner():
# 装饰函数之前的部分
print("I am the former")
#被装饰函数
f()
# 装饰函数之后的部分
print(('I am the later'))
return inner
def add():
print("I am add")
# 将原函数更改为装饰后的函数
add = wrapper(add)
add()
打印的结果:
I am the former
I am add
I am the later
语法糖操作:
# 装饰器函数
def wrapper(f):
def inner():
# 装饰函数之前的部分
print("I am the former")
f()
# 装饰函数之后的部分
print(('I am the later'))
return inner
#语法糖操作
@wrapper
def add():
print("I am add")
# 将原函数更改为装饰后的函数
add()
打印结果:
I am the former
I am add
I am the later
通用装饰器的函数模板:
#通用装饰器函数模板
def wrapper(f):
#设置 *args 接受数目不确定的非字典参数, *kwargs 接受数目不确定的字典参数
def inner(*args, **kwargs):
#目标函数之前的新增函数
#记录目标函数的返回值,并返回
ret = f(*args, **kwargs)
#目标函数之后的新增函数
return ret
return inner
@wrapper
def add(username, password):
高级装饰器:多个装饰器装饰一个函数。
def wrapper1(f):
def inner(*args, **kwargs):
print("wrapper1_before")
ret = f(*args, **kwargs)
print("wrapper1_after")
return ret
return inner
def wrapper2(f):
def inner(*args, **kwargs):
print("wrapper2_before")
ret = f(*args, **kwargs)
print("wrapper2_after")
return ret
return inner
def wrapper3(f):
def inner(*args, **kwargs):
print("wrapper3_before")
ret = f(*args, **kwargs)
print("wrapper3_after")
return ret
return inner
#三个装饰器装饰k函数
#就近原则,wrapper1先装饰k,然后整个函数合并后赋给k,之后wrapper2又装饰k,然后整个函数合并后赋给k,依此类推,得到全部的函数
@wrapper3
@wrapper2
@wrapper1
def k():
print("I am k")
k()
打印后的结果:
wrapper3_before
wrapper2_before
wrapper1_before
I am k
wrapper1_after
wrapper2_after
wrapper3_after
带参数的装饰器:一个装饰器装饰多个函数。通过对首部参数的调整,来实时地改变自身,来适应被修饰函数
name = input("Please Input: ")
#带参数的装饰器
def wrapper_outer(name):
def wrapper(f):
def inner(*args, **kwargs):
print(name, "wrapper_before")
ret = f(*args, **kwargs)
print(name, "wrapper_after")
return ret
return inner
return wrapper
#返回wrapper 调用wrapper
@wrapper_outer(name)
def func():
print("I am func")
func()
打印结果:
Please Input:ww
ww wrapper_before
I am func
ww wrapper_after