装饰器概念:装饰器就是对原函数的拓展,在不改变原核心代码的情况下新增新功能。
这个概念挺重要的,不会装饰器,就不能说真的会python。
装饰器主要有以下几种方式:
import time
def func01(func):
#确保装饰器被调用
def func02():
print('我是装饰器函数,对函数增加计时功能')
start_time = time.time()
func()
used_time = time.time()-start_time
print(used_time)
return func02
@func01
#这一步的意思就是func03 = func01(func03),一定要记住,完全等价!!!
def func03():
print('我是被装饰函数')
time.sleep(2)
print('执行完毕')
#带参数如何做?
#带多个参数呢?
def func04(func):
#确保装饰器被调用
#def func05(x):
def func05(*args,**kwargs):
print('向执行函数传输参数:',args)
func(*args,**kwargs)
return func05
@func04
def func06(x,y):
print('传入参数值为:',x,y)
@func04
def func07(x,y,z):
print('传入参数值为:',x,y,z)
#如果一个装饰器不够呢?
def func08(func):
def func09():
print('我是第一个装饰器')
func()
return func09
def func10(func):
def func11():
print('我是第二个装饰器')
func()
return func11
#装饰的时候是从下网上装饰,执行是从上往下执行。
@func08
@func10
def func12():
print('我是被装饰的函数')
#如果执行函数有返回值的情况呢?
#定义装饰器函数
def func13(func):
def func14():
print('我是装饰器函数')
ret = func()
return ret
return func14
#定义被执行函数
@func13
def func15():
print('我是被装饰的函数')
return 1
if __name__ == '__main__':
func03()
'''
func06(100,200)
func07(1, 2, 4)
#用于测试两个装饰器的函数
func12()
print('func15()返回值为:',func15())
'''
(1)简单装饰器,执行func03()的时候
我是装饰器函数,对函数增加计时功能
我是被装饰函数
执行完毕
2.0124034881591797
(2)不定参数,执行func06(),func07()
向执行函数传输参数: (100, 200)
传入参数值为: 100 200
向执行函数传输参数: (1, 2, 4)
传入参数值为: 1 2 4
(3)多个装饰器,执行func12()
我是第一个装饰器
我是第二个装饰器
我是被装饰的函数
(4)带有返回值的装饰器,执行func15()
我是装饰器函数
我是被装饰的函数
func15()返回值为: 1