Python 之进阶函数 (装饰器)
程序员文章站
2022-06-29 21:22:34
今天我们主要讲解一部分的装饰器,从最简单的装饰器,到带返回值的装饰器,到带参数的装饰器,最后到固定装饰器 在开始讲装饰器之前,我们要像讲两个知识点,一个是time模块和语法糖 1)time模块 time.time() :某段程序的执行时间 time.sleep() :睡眠,(time)中可以添加参数 ......
今天我们主要讲解一部分的装饰器,从最简单的装饰器,到带返回值的装饰器,到带参数的装饰器,最后到固定装饰器
在开始讲装饰器之前,我们要像讲两个知识点,一个是time模块和语法糖
1)time模块
time.time() :某段程序的执行时间
time.sleep() :睡眠,(time)中可以添加参数,time表示时间
针对time.time(),我们在使用的时候我们可以把它放在需要测速的代码的上下,这样就可以检测当前代码的运行时间
由于有的时候,某段程序执行速度过快,所以我们可以time.sleep()来增加它的初始时间。防止检测值是 0.0
2)语法糖:@装饰函数名
装饰器:
1.最简单的装饰器
def timer(f):
#闭包,这里闭包的不是变量,而是形参f
def inner():
time.time()
f()
time.time()
return inner
def func():
print('hello ,装饰器')
time.sleep(0.1)
2.带返回值的装饰器
def timmer(f): #装饰器函数,它的形参一定是被装饰函数
def inner():
start = time.time() #函数开始前书写区域
x = f() #接受func的返回值
end = time.time() #函数开始后书写区域
print(end - start)
return x #inner的返回值
return inner #timmer的返回值
@timmer # @装饰器函数名 ,它的下面一定是被装饰函数
def func():
print('你好,我要开始默写带返回值的装饰器了')
time.sleep(0.1)
return 'hello'
f1 = func()
print(f1)
timmer有返回值,返回值是inner(),所有我们调用timmer,就是调用函数inner(),然后查看inner是否有返回值,
然后最开始inner()也是没有返回值,所以用一个变量来接受装饰器函数,并且返回该变量,这个时候inner的返回值就是
变量ret,所以当我们调用timmer函数的时候,返回值是ret的内容
3.带参数的装饰器
def timmer(f): #装饰器函数,它的形参一定是被装饰函数
def inner():
start = time.time() #函数开始前书写区域
x = f() #接受func的返回值
end = time.time() #函数开始后书写区域
print(end - start)
return x #inner的返回值
return inner #timmer的返回值
@timmer # @装饰器函数名 ,它的下面一定是被装饰函数
def func(a):
print('你好,我要开始默写带返回值的装饰器了')
time.sleep(0.1,a)
return 'hello'
f1 = func(1)
print(f1)
4.固定装饰器
def wrapper(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
print('count')
return ret
return inner
@wrapper
def conf(a,b):
print(a,'+',b)
return 'hello'
x = conf(12,23)
通过对装饰器的学习,逐渐理解了装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数中添加内容