import time
# 都不带参数
def dinner(func):
def wrapper():
start_time = time.time()
print('饭前洗了一次手!')
func()
print('饭后擦了一下嘴!')
end_time = time.time()
print('吃饭花了我\t{}秒'.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('吃饭花了我\t{}秒'.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('吃饭花了我\t{}秒'.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秒
喝完汤我小憩了一会.
'''