欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 装饰器备忘

程序员文章站 2022-06-08 20:48:44
``` def deco(attr): ''' 装饰器,共包含三层返回结构 \n 第一层:用于接收 @deco 的参数,此处的代码只在初始化装饰器时执行一次 \n 第二层:用于接收 function,此处的代码只在初始化装饰器时执行一次 \n 第三层:用于接收 function 的参数,并将作为最终... ......
def deco(attr):
    ''' 装饰器,共包含三层返回结构 \n
        第一层:用于接收 @deco 的参数,此处的代码只在初始化装饰器时执行一次 \n
        第二层:用于接收 function,此处的代码只在初始化装饰器时执行一次 \n
        第三层:用于接收 function 的参数,并将作为最终被执行与返回的装饰结果 \n
    '''
    def _deco(f):
        '''第二层:用于接收 function,此处的代码只在初始化装饰器时执行一次
        '''
        print('只在装饰函数时,执行一次,此时装饰函数', f.__name__)

        def __deco(a, b):
            '''第三层:用于接收 function 的参数,并将作为最终被执行与返回的装饰结果
            '''
            print('before run attr: ' + attr + '; a: ' + a + '; b: ' + b)
            # 此处必须调用 function,不然装饰器执行过后,就不会再执行 function 的函数体
            f(a, b)
            print('after  run attr: ' + attr + '; a: ' + a + '; b: ' + b)

        return __deco
    return _deco


@deco('hello')
def hello(a, b):
    print('hello, ' + a + b)


@deco('world')
def world(a, b):
    print('world, ' + a + b)


hello('a', 'b')
world('A', 'B')


# 执行结果:
# 
# 只在装饰函数时,执行一次,此时装饰函数 hello
# 只在装饰函数时,执行一次,此时装饰函数 world
# before run attr: hello; a: a; b: b
# hello, ab
# after  run attr: hello; a: a; b: b
# before run attr: world; a: A; b: B
# world, AB
# after  run attr: world; a: A; b: B