接上篇python 闭包&装饰器(一)
一、功能函数加参数:实现一个可以接收任意数据的加法器
源代码如下:
代码语言:javascript复制def show_time(f):
代码语言:javascript复制 def inner(*x, **y): # 形参
start = time.time()
f(*x, **y) # 相当于add()
end = time.time()
print('spend %s' % (end - start))
代码语言:javascript复制 return inner
代码语言:javascript复制@show_time # @show_time 等于 add = show_time(add)
def add(*a, **b): # 实参 可以接收任意参数
sums = 0
for i in a:
sums = i
print(sums)
time.sleep(1)
add(1, 2, 3, 4, 5) # 15
二、装饰器函数加参数:根据需求打印日志
源代码如下:
代码语言:javascript复制def logger(flag=''): # flag 默认为空,这一层函数的作用是应用标志位
def show_time(f):
def inner(*x, **y):
start = time.time()
f(*x, **y) # 相当于add()
end = time.time()
print('spend %s' % (end - start))
if flag == 'true':
print('打印日志')
return inner
return show_time
@logger('true') # @show_time
def add(*a, **b): # 不管有名参数和无名参数都可以接收到
sums = 0
for i in a:
sums = i
print(sums)
time.sleep(1)
add(1, 2, 3, 4, 5)
@logger('true')
def bar():
print('bar.......')
time.sleep(3) # 停留3秒
bar()
注意:@logger('true') 的执行机制是:先执行 logger('true') 函数,然后返回 show_time 函数的内存地址, 所以 @logger('true') 就相当于 @show_time,两者的区别就是 @logger('true') 要了一个变量flag, 之后的装饰器函数里面就可以使用falg这个标志位了