带有参数的装饰器

带有参数的装饰器

就是使用装饰器装饰函数的时候可以传入指定参数

语法格式:@装饰器(参数,…)

@decorator('+')
def add(a, b):
	result = a + b
	return result

带有参数的装饰器的使用

需求:如以下的add函数和sub函数,使用一个装饰器对二者修饰

装饰产生的功能为:识别两个函数使用的是加法还是减法

def add(a, b):
	result = a + n
	return result

def sub(a, b):
	result = a - b
	return result

示例: 错误演示

# 装饰器
# 外部函数
def decorator(fn, flag):
    # 内部函数
    def inner(num1, num2):
        # 判断流程
        if flag == '+':
            print('--正在努力加法计算--')
        elif flag == '-':
            print('--正在努力减法计算--')
        result = fn(num1, num2)
        return result

    return inner

# 被带有参数的修饰器修饰的函数
@decorator('+')
def add(a, b):
    result = a + b
    return result

# 执行函数
result = add(1, 3)
print(result)

示例:正确使用

# 装饰器
def logging(flag): # flag = "+"
    # 外部函数
    def decorator(fn):
        # 内部函数
        def inner(num1, num2):
            # 判断流程
            if flag == '+':
                print('--正在努力加法计算--')
            elif flag == '-':
                print('--正在努力减法计算--')
            result = fn(num1, num2)
            return result

        return inner

    # 返回装饰器
    return decorator

# 被带有参数的修饰器修饰的函数
@logging('+') # 1. logging("+") 2. @decorator起到了装饰器的功能了
def add(a, b):
    result = a + b
    return result

# 执行函数
result = add(1, 3)
print(result)

带参数的装饰器:

  1. 装饰器的外部函数只接收一个参数——被装饰的函数
  2. 需要给装饰器传参数需要再装饰器外部再增加一个函数