函数可以作为参数,赋值给其他变量或者传递给其他函数,这是理解装饰器的基础。
函数赋值给其他变量的例子(example 1):
def sum(a, b):
r = a+b
print(r)
return r
# sum是个函数,赋值给 same_sum,same_sum也是个函数
same_sum = sum
same_sum(1, 2) # 输出3
# -------------------------------------
# 通用的即:
def func(*args, **kwargs):
pass
same_func = func
same_func(*args, **kwargs)
函数作为参数的例子(example 2):
def same_func(func):
return func
sum_new = same_func(sum)
sum_new(1, 2) # 输出3
把example 2 中的same_func换一种写法
def same_func(func):
def inner(*args, **kwargs):
return func(*args, **kwargs)
# 把 inner 函数赋值给 same_inner这个变量
same_inner = inner
# 赋值后same_inner就是inner,参照example 1
return same_inner
same_new2 = same_func(sum)
same_new2(1, 2)
至此,理解装饰器时所需要的基础概念介绍完毕。
下面看一个函数:
import time
# calc_time函数的返回值是一个函数
def calc_time(func):
def inner(*args, **kwargs):
t0=time.time()
func(*args,**kwargs)
t1=time.time()
print('程序花费了{}秒'.format(t1-t0))
return inner
上述calc_time的返回值是一个函数,调用这个函数的时候,这个函数内部会执行func
#此时的new_sum 就是calc_time的返回值(inner),它是一个函数
new_sum = calc_time(sum)
# 输出3
# 输出 程序花费了xxx秒
new_sum(1, 2)
上述 new_sum = calc_time(sum)的语法,在python中,在定义函数的时候,函数上面加一个@calc_time的方式是同一个意思,这也就是装饰器
@calc_time
def sum(a, b):
r = a+b
print(r)
return r
# 输出3
# 输出 程序花费了xxx秒
sum(1,2)
# 等价于如下:
# sum = calc_time(sum)
# sum(1, 2)