装饰器和闭包理解(一)
''' @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 <function f1 at 0x00000000039FC1E0> runnig register is <function f2 at 0x00000000039FC268> -------------------------------- 开始执行 已执行: [<function f1 at 0x00000000039FC1E0>, <function f2 at 0x00000000039FC268>] 执行f1 执行f3 结论,装饰函数在导入模块时立刻执行,而被装饰函数只在明确调用时运行 可以看到,f2未被调用,但是其装饰函数先行执行了. '''