Python装饰器
无返回值的装饰器:
import time def timer(func): # 无返回值装饰器 def test_extra(*args, **kwargs): # 传入参数长度可变(参数多少都可用) start_time = time.time() # 装饰器添加功能:计时 func(*args, **kwargs) # 执行原函数功能 end_time = time.time() print("The func has run for %s s\n" % (end_time - start_time)) return test_extra # 返回的是test_extra的内存地址,不是test_extra的运行结果 @timer # text1 = timer(text1) def test(): # 原函数不需要参数 time.sleep(1) print("This is test1.") test() # 调用方式不变
输出结果:
This is test1.
The func has run for 1.000288248062134 s
def timer(func): # 无返回值装饰器 def test_extra(*args, **kwargs): # 传入参数长度可变(参数多少都可用) start_time = time.time() # 装饰器添加功能:计时 func(*args, **kwargs) # 执行原函数功能 end_time = time.time() print("The func has run for %s s\n" % (end_time - start_time)) return test_extra # 返回的是test_extra的内存地址,不是test_extra的运行结果 @timer def test(name, age): # 原函数需要参数 print("In the test2") time.sleep(2) print("Your name is " + name + age) test("name", "1") # 调用方式不变
输出结果:
In the test2
Your name isname1
The func has run for 2.0002686977386475 s
有返回值的装饰器:
import time def timer(func): # 有返回值的装饰器 def test_extra(*args, **kwargs): # 传入参数长度可变(参数多少都可用) start_time = time.time() # 装饰器添加功能:计时 res = func(*args, **kwargs) # 获得func函数的返回值 end_time = time.time() print("The func has run for %s s\n" % (end_time - start_time)) return res # 返回原函数的返回值 return test_extra # 返回的是test_extra的内存地址,不是test_extra的运行结果 @timer def test(content): print("In the test") time.sleep(2) print(content) return "This is return of test" print(test("666")) # 打印出test的返回值
输出结果:
In the test
666
The func has run for 2.0005550384521484 s
This is return of test
和之前的区别只是最内层的函数有了返回值,等于原函数的返回值
可以传给装饰器传一个额外参数的装饰器
import time def timer(parameter): # 可以传给装饰器传一个额外的参数的装饰器 def timer_in(func): def test_extra(*args, **kwargs): # 传入参数长度可变(参数多少都可用) print(parameter) start_time = time.time() func(*args, **kwargs) # 获得func函数的返回值 end_time = time.time() print("The func has run for %s s\n" % (end_time - start_time)) return test_extra # 返回的是test_extra的内存地址,不是test_extra的运行结果 return timer_in @timer(parameter="This is an extra parameter") # 给装饰器传入一个参数 def test(content): time.sleep(2) print("This is in the test") print(content) test("666") # 打印出test的返回值
输出结果:
This is an extra parameter
This is in the test4
666
The func has run for 2.0006258487701416 s
和之前的区别是又多加了一层函数
小结
- 装饰器就是先嵌套一层函数添加功能,再嵌套一层函数,这层函数的返回值是里面那一层函数的内存地址
- 装饰器中函数的返回值不要加括号,传入的是内存地址,不是运行结果
- 装饰器给原函数传参用(*args, **kwargs)
- 注意:装饰器不能直接用于迭代函数,否则会把装饰器一起迭代,需要使用另一个添加装饰器的函数调用需要装饰的函数