作者:程璇 | 来源:互联网 | 2023-12-10 12:43
1. 带有参数的装饰器介绍
带有参数的装饰器就是使用装饰器装饰函数的时候可以传入指定参数,语法格式: @装饰器(参数,…)
错误写法:
def decorator(fn, flag):def inner(num1, num2):if flag == "+":print("--正在努力加法计算--")elif flag == "-":print("--正在努力减法计算--")result = fn(num1, num2)return resultreturn inner@decorator('+')
def add(a, b):result = a + breturn resultresult = add(1, 3)
print(result)
执行结果:
Traceback (most recent call last):
File “/home/python/Desktop/test/hho.py”, line 12, in
@decorator(’+’)
TypeError: decorator() missing 1 required positional argument: ‘flag’
代码说明:
装饰器只能接收一个参数,并且还是函数类型。
正确写法:
在装饰器外面再包裹上一个函数,让最外面的函数接收参数,返回的是装饰器,因为@符号后面必须是装饰器实例。
# 添加输出日志的功能
def logging(flag):def decorator(fn):def inner(num1, num2):if flag == "+":print("--正在努力加法计算--")elif flag == "-":print("--正在努力减法计算--")result = fn(num1, num2)return resultreturn inner# 返回装饰器return decorator# 使用装饰器装饰函数
@logging("+")
def add(a, b):result = a + breturn result@logging("-")
def sub(a, b):result = a - breturn resultresult = add(1, 2)
print(result)result = sub(1, 2)
print(result)
–正在努力加法计算–
3
–正在努力减法计算–
-1
2. 小结
使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回是装饰器,因为 @ 符号需要配合装饰器实例使用