[Python3]装饰器之我的一些理解

个人的一些理解,可能会有错误,有问题请指正。

装饰器总结

# 不带参数的装饰器
def test(func):                               # 第二步  rel = test(rel)  返回inner  新rel = inner
    print('这是装饰器外层')
    def inner(*args):                         # 第四步  执行inner()
        print('这是装饰器内层')
        func(*args)                           # 第五步 执行第二步传进来的老rel()函数
        print('被装饰函数已执行')
    return inner


@test                                          # 第一步,先执行装饰器 @test相当于rel = test(rel) 把rel函数名传进装饰器里
def rel(*args):
    print('这是被装饰的函数')

rel('123', '234')                              # 第三步 rel 实际是装饰器return的 inner的内存地址,执行rel()相当用执行inner()

结论:当调用rel()时,其实相当于调用了test(rel),通过test里的功能以后,就会自动调用rel功能
-----------------------------------------------------------------------------------------------------
# 带参数的装饰器
  
def test(type):                        # 第二步 type = 'qq' 向下执行返回outer
    print('这是装饰器外层')
    def outer(func):                   # 第四步,把rel函数名传进outer函数 返回inner
        def inner(*args):              # 第六步,执行inner及被装饰器装饰的rel()函数
            if type == 'qq':
                print('这是装饰器内层')
                func(*args)            
                print('被装饰函数已执行')
            else:
                print('just qq')
                func(*args)
        return inner
    return outer

@test('qq')                            # 第一步,执行装饰器传入参数'qq'   test = test('qq')      第三步,rel = outer(rel)
def rel(*args):
    print('这是被装饰的函数')

@test('weixin')
def rel1(*args):
    print('这是被装饰的函数2')

rel('123','2323')               # 第五步,rel() = inner(),当调用rel函数时,实际调用的是之前outer(rel)返回的inner的内存地址
rel1()

猜你喜欢

转载自blog.csdn.net/TynMhxx/article/details/81610351