""" 需求:参数传入0 希望时间用整数显示,参数传入1 用浮点数显示 """ import time def get_run_time(flag): """装饰器工厂函数""" def get_time(func): """装饰器函数:对函数运行时间进行统计""" print('in get_time') def inner(*args, **kwargs): t1 = time.time() res = func(*args, **kwargs) t2 = time.time() if flag == 0: print('运行了%d s' % (t2 - t1)) else: print('运行了%f s' % (t2 - t1)) return res return inner return get_time # 装饰器工厂函数的作用: # 1.>接收装饰器函数所需要但是又不能直接接受的参数---->接收参数 # 2.>生产装饰器对象---->产生装饰器函数 # 关联: 装饰器工厂内部是装饰器函数 # 真正执行过程: # 1.> get_time = get_run_time(参数) # 2.> @get_time 对func1函数进行装饰 func1 = get_time(func1) @get_run_time(0) # 这句话的返回值是get_time这个函数名 def func1(num, age=18): for i in range(3): time.sleep(1) print('in func', num, age) # @get_run_time(1) 注意:这个要分开看 f1 = get_run_time(1) 这是一个整体,函数调用,然后返回一个值 # @f1 这才是真正的装饰器函数开始了 func1(89) """ 问题: 1.>装饰器工厂函数是装饰器函数吗? 不是,工厂内部定义了装饰器函数,并且return装饰器函数的引用 2.>装饰器工厂函数和装饰器的关系? 工厂的返回值是装饰器函数的引用.它的作用就是创建一个装饰器函数的对象<或者叫地址引用更合适> """
多个装饰器装饰一个函数:
""" <i> 斜体 <b> 加粗,黑体 多个装饰器:同时扩展多个功能 """ def makeBold(func): """加粗""" def inner(*args,**kwargs): return '<b>' + func() + '</b>' return inner def makeItalic(func): """倾斜""" def inner(*args,**kwargs): return '<i>' + func() + '</i>' return inner @makeItalic @makeBold @makeItalic def f1(): return '人生苦短,我用Python' print(f1()) # <i><b><i>人生苦短,我用Python</i></b></i> # 执行顺序,先倾斜,后加粗, 类似于穿衣服,内衣先,外套后 # 灵魂代码理解: f1 = makeItalic(f1) # 1.>f11 = makeItalic(f1) f11是 makeItalic 里面的inner ; # 2.>f111 = makeBold(f11) f111是makeBold 里面的inner # 一步理解: f1 = makeBold(makeItalic(f1)) ------> 简单理解就是多层装饰了 # 类似于寄快递,自己包一层之后快递小哥也会帮你再去 包一层. # 执行顺序一定是先去执行最内层的.<最内层的装饰器先完成装饰> # 但是是最外层的最先开始装饰,它需要内层的装饰完成才能去装饰.