装饰器
一.装饰器的引入
有这样的需求,要在不修改原函数的情况下,对函数进行扩展。
原函数:
def add(a,b):
return a + b
需要对上面的函数进行扩展,但不能修改该函数:
def add_expand(a,b):
a += 1
b *= 3
c = add(a,b)
return c
调用扩展后的函数:
print(add_expand(10,30)) # 101
二.装饰器的使用
上面的函数已经可以在不修改源代码的情况下对原函数进行扩展,但是该扩展函数函数无法复用。所以我们可以创建一个函数,用来生成新的扩展函数,我们称这样的函数为装饰器函数。
装饰器函数:
def build_function(old_function):
"""
这是一个装饰器函数,可以对旧函数进行扩展,生成一个新的函数
:param old_function: 需要进行扩展的函数
:return: 扩展后的函数
"""
def new_function(*args, **kwargs):
"""
这是装饰器扩展后的新函数
:param args: 任意个数的普通变量
:param kwargs: 任意个数的关键字变量
:return:
"""
print("开始执行~~~")
result = old_function(*args, **kwargs)
print("结束执行~~~")
return result
# 返回生成的新函数
return new_function
对装饰器函数build_function()的运用。对add()函数进行扩展:
result_function = build_function(add)
print(result_function(4, 5))
还可以简化对装饰器函数的使用:
# 简化调用装饰器函数的过程
@build_function
def mul(a,b):
"""
这是被装饰器函数build_function()进行过扩展后的新函数
:param a:
:param b:
:return:
"""
print('a * b =', a * b)
# 调用被扩展后的mul()函数
mul(45,67)