07-装饰器

装饰器

  • 一个函数, 两个功能
def func_3(line):
    def comp(value):
        if value >= line:
            print('{} >= {}'.format(value, line))
        else:
            print('{} < {}'.format(value, line))
    return comp

f = func_3(60)  # 第一次调用外侧函数
f(89)  # 第二次调用内层x
# 相当于 
func_3(60)(89)  
  • 自动将函数的参数放进了中间功能函数的中作为参数
  • 会将实际传入目标函数的参数在装饰器中先传入进行验证, 也就是先执行装饰器的函数, 再执行目标函数
def dec_1(func):
    def wrapper(num1, num2):
        if num2 == 0:
            return ('0000')
        return func(num1, num2)
    return wrapper

def average_1(num1, num2):
    return num1 / num2

# averge_1 = dec_1(average_1)
# a = averge_1(5, 0)
# print(a)
@dec_1
def sum_1(num1, num2):
    return num1 + num2
a = sum_1(1, 0)
print(a)

==接收不同 的参数==

  • 装饰器需要写三层
  • 也就是说最内层的只能接收到目标函数的参数, 但是如果需要传入目标函数参数以外的参数就必须要再加一层装饰器, 来讲需要的参数传入
def auth(auth_type):
    def dec_3(func):
        def wrapper(*args, **kwargs):
            if auth_type == '1':
                print('111111111')
            elif auth_type == '2':
                print('22222222')
            else:
                print('0000--0000')
            return func(*args, **kwargs)
        return wrapper
    return dec_3
@auth(auth_type='4')
def average_3(*args):
    return sum(args)
a = average_3(1, 2, 3, 4)
print(a)