import time # 都不带参数 def dinner(func): def wrapper(): start_time = time.time() print('饭前洗了一次手!') func() print('饭后擦了一下嘴!') end_time = time.time() print('吃饭花了我 {}秒'.format(end_time - start_time)) return wrapper @dinner def eat(): print('Eat...') time.sleep(2) @dinner def drink(): print('Drink...') time.sleep(3) eat() drink() ''' 饭前洗了一次手! Eat... 饭后擦了一下嘴! 吃饭花了我 2.000243663787842秒 饭前洗了一次手! Drink... 饭后擦了一下嘴! 吃饭花了我 3.000170946121216秒 '''
import time # 被装饰的函数带参数 def dinner(func): def wrapper(a, b): start_time = time.time() print('饭前洗了一次手!') func(a, b) print('饭后擦了一下嘴!') end_time = time.time() print('吃饭花了我 {}秒'.format(end_time - start_time)) return wrapper @dinner def eat(a, b): print('I have {} and {} at dinner'.format(a, b)) time.sleep(2) @dinner def drink(a, b): print('I drink {} and {} at dinner'.format(a, b)) time.sleep(3) eat('potato', 'rice') drink('beer', 'tea') ''' 饭前洗了一次手! I have potato and rich at dinner 饭后擦了一下嘴! 吃饭花了我 2.004790782928467秒 饭前洗了一次手! I drink beer and tea at dinner 饭后擦了一下嘴! 吃饭花了我 3.0000154972076416秒 '''
import time ''' 带参数的装饰器(装饰函数), 实际是对原有装饰器的一个函数的封装,并返回一个装饰器(一个含有参数的闭包函数), 当使用@time_logger(3)调用的时候,Python能发现这一层封装,并将参数传递到装饰器的环境去 ''' # 装饰器 和 被装饰函数 都带参数 def eat_and_drink(flag=''): def dinner(func): def wrapper(a, b): start_time = time.time() print('饭前洗了一次手!') func(a, b) print('饭后擦了一下嘴!') end_time = time.time() print('吃饭花了我 {}秒'.format(end_time - start_time)) if flag: print(flag) return wrapper return dinner @eat_and_drink('吃完饭我吃了一个苹果.') def eat(a, b): print('I have {} and {} at dinner'.format(a, b)) time.sleep(2) @eat_and_drink('喝完汤我小憩了一会.') def drink(a, b): print('I drink {} and {} at dinner'.format(a, b)) time.sleep(3) eat('potato', 'rice') drink('beer', 'tea') ''' 饭前洗了一次手! I have potato and rice at dinner 饭后擦了一下嘴! 吃饭花了我 2.009742259979248秒 吃完饭我吃了一个苹果. 饭前洗了一次手! I drink beer and tea at dinner 饭后擦了一下嘴! 吃饭花了我 3.00014066696167秒 喝完汤我小憩了一会. '''