# import time
#
#
# def show_time(func):
# def wrapper():
# start_time = time.time()
# func()
# end_time = time.time()
# print('spend %s' % (end_time - start_time))
#
# return wrapper
#
#
# @show_time # 此句相当于foo=show_time(foo)
# def foo():
# print('hello foo')
# time.sleep(3)
#
#
# @show_time # 此句相当于bar=show_time(bar)
# def bar():
# print('in the bar')
# time.sleep(2)
#
#
# foo()
# print('***********')
# bar()
#上所示,这样我们就可以省去bar = show_time(bar)这一句了,直接调用bar()即可得到想要的结果。如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。
# 这里需要注意的问题: foo=show_time(foo)其实是把wrapper引用的对象引用给了foo,而wrapper里的变量func之所以可以用,就是因为wrapper是一个闭包函数。
# 带参数的被装饰函数
'''
import time
def show_time(func):
def wrapper(a, b):
start_time = time.time()
func(a, b)
end_time = time.time()
print('spend %s' % (end_time - start_time))
return wrapper
@show_time # add=show_time(add)
def add(a, b):
time.sleep(1)
print(a + b)
add(2, 4)
'''
#***********************************不定长参数
# import time
#
# def show_time(func):
#
# def wrapper(*args,**kwargs):
# start_time=time.time()
# func(*args,**kwargs)
# end_time=time.time()
# print('spend %s'%(end_time-start_time))
#
# return wrapper
#
# @show_time #add=show_time(add)
# def add(*args,**kwargs):
#
# time.sleep(1)
# sum=0
# for i in args:
# sum+=i
# print(sum)
#
# add(2,4,8,9)
#
# 装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如 @ show_time,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如 @ decorator(
# a)。这样,就为装饰器的编写和使用提供了更大的灵活性。
# import time
#
# def time_logger(flag=0):
# def show_time(func):
# def wrapper(*args, **kwargs):
# start_time = time.time()
# func(*args, **kwargs)
# end_time = time.time()
# print('spend %s' % (end_time - start_time))
#
# if flag:
# print('将这个操作的时间记录到日志中')
#
# return wrapper
#
# return show_time
#
# @time_logger(3)
# def add(*args, **kwargs):
# time.sleep(1)
# sum = 0
# for i in args:
# sum += i
# print(sum)
#
#
# add(2, 7, 5)
# @time_logger(3)
#
# 做了两件事:
# (1)time_logger(3):得到闭包函数show_time,里面保存环境变量flag
# (2)@show_time:add=show_time(add)
#
# 上面的time_logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。当我
# 们使用 @ time_logger(3)
# 调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。
'''
#多层装饰器
def makebold(fn):
def wrapper():
return "<b>" + fn() + "</b>"
return wrapper
def makeitalic(fn):
def wrapper():
return "<i>" + fn() + "</i>"
return wrapper
@makebold
@makeitalic
def hello():
return "hello alvin"
# hello()
print(hello())
'''
来源: https://www.cnblogs.com/yuanchenqi/articles/5830025.html