函数装饰器是 Python 中一种用来修改、包装函数行为的高级技术。它实际上是一个可调用对象(函数、类或方法),用来接收一个函数作为参数,并返回一个新的函数作为结果。函数装饰器通常以 `@decorator_function` 的语法形式使用,放在函数定义前面。
在函数装饰器中,您可以在不修改原始函数代码的情况下,向其添加额外的功能、行为或逻辑。这种技术使得代码更加简洁和易于维护,同时也提供了一种灵活的方式来扩展函数的功能。
装饰器函数
装饰器函数是高阶函数的一种应用: 输入参数是函数, 返回值也是函数
def decorator_func(func):
def wrapped_func(*args, **kwargs):
print(args, kwargs)
return func(*args, **kwargs)
return wrapped_func
装饰器函数使用
# 原始函数
def mysum(*args):
return sum(args)
# 对函数进行包装
new_sum = decorator_func(mysum)
# 测试
print(mysum[1, 2, 3])
print(new_sum([1, 2, 3])
装饰器语法糖@
@decorator_func
def mysum(*args):
return sum(args)
# 测试
print(mysum([1, 2, 3]))
装饰器函数应用
装饰器函数示例1
# mysum、mysub两个函数都需要进行类型检测
# 显而易见, 他们的类型判断部分代码高度重复
def mysum(a, b)
if type(a) == int and type(b) == int:
return a + b
else:
print("只能进行整数运算")
def mysub(a, b)
if type(a) == int and type(b) == int:
return a - b
else:
print("只能进行整数运算")
# 利用装饰器函数优化代码
def decorator_func(func):
def warpped_func(*args, **kwargs):
if type(a) == int and type(b) == int:
return func(*args)
else:
print("只能进行整数运算")
@decoraor_func
def mysum(a, b):
return a + b
@decorator_func
def mysub(a, b):
return a - b
# 测试
mysum("a", "b")
mysub("a", "b")
带参数的装饰器函数
在日常开发中会经常看到装饰器包含参数, 比如下面的代码就是flask的路由配置装饰器
@app.route("/index")
def index():
pass
@app.route("/member")
def member():
pass
# 装饰器route关键部分
# 装饰器route返回的是最终的装饰器
def route(rule):
def decorator(func):
endpoind = options.pop("endpoind", None)
self.add_url_rule(rule, endpoind, func, **options)
return func
return decorator
带参数的装饰器函数示例
# 使用装饰器函数定义两个函数
# 第一个函数对传入的整数进行求和
# 第二个函数对传入的字符串进行拼接
# 对装饰器的要求, 传入str,就要求输入是字符串,传入int, 就要求输入是整数
# 装饰器函数
def valid_type_setup(input_type):
def decorator_func(func):
def wrapped_func(*args, **kwargs):
for arg in args:
if type(arg) != input_type:
print("输入类型必须是:", input_type)
return
return func(*args, **kwargs)
return wrapped_func
return decorator_func
# 对函数进行装饰
@valid_type_setup(int):
def int_process(*args):
return sum(args)
@valid_type_setup(str):
def str_process(*args):
return "".join(args)
装饰器顺序
一个函数如果被多个装饰器装饰,装饰顺序由内而外
def decorator_f1(func):
def wrapped_func(*args, **kwargs):
print("f1")
return func(*args, **kwargs)
return wrapped_func
def decorator_f2(func):
def wrapped_func(*args, **kwargs):
print("f2")
return func(*args, **kwargs)
return wrapped_func
def my_func(*args):
print(args)
func = decorator_f1(decorator_f2(my_func))
func()
@decorator_f1
@decorator_f2
def func(*args):
print(args)
装饰器函数练习
# 根据环境变量debug是否为True, 决定函数执行时是否打印日志
讨论区