装饰器和闭包理解(一)

'''
@Descripttion: 
@version: 
@Author: 冯浩
@Date: 2019-10-21 15:19:54
@LastEditors: 冯浩
@LastEditTime: 2019-10-21 16:02:34
'''
#例子一
def deco1(func):# 装饰器
    def inner():
        print('装饰器内部函数')
    return inner

#原始表达方式, 装饰器其实就是该方式的语法糖
def example0():
    print('原始函数')

print(id(example0))
example0 = deco1(example0) #本行即为装饰器本质
print(id(example0))
print('*'*32)
example0() #执行替换后的本函数

#装饰器表达法,装饰器可以理解为函数调用的简化表达
@deco1
def example1():
    print('原始函数')
print(
'-'*32) example1() #执行装饰器表达后的本函数 '''
执行结果如下:
63866536 60649120 ******************************** 装饰器内部函数 -------------------------------- 装饰器内部函数 ''' 补充:example1()表是调用函数的执行结果,example1表示调用函数本身(函数并未执行)

 

'''
@Date: 2019-10-20 23:05:26
@LastEditors: 冯浩
@LastEditTime: 2019-10-21 23:58:33
'''

registry=[]
def register (func):#装饰函数
    print('runnig register is %s'% func)
    registry.append(func)
    return func

@register
def f1():
    print('执行f1')

@register
def f2():
    print('执行f2')

def f3():
    print('执行f3')

def main():
    print('-'*32,'\n开始执行')
    print('已执行:', registry)
    f1()
    # f2()
    f3()

if __name__ == "__main__":
    main()

'''
执行结果如下:
runnig register is 
runnig register is 
--------------------------------
开始执行
已执行: [, ]
执行f1
执行f3

结论,装饰函数在导入模块时立刻执行,而被装饰函数只在明确调用时运行
可以看到,f2未被调用,但是其装饰函数先行执行了.
'''

 

 

 

你可能感兴趣的:(装饰器和闭包理解(一))