一、装饰器

1.相关知识点

  • *args:负责将多余的位置实参汇总,赋值给args
  • **kwargs:负责将多余的关键字实参汇总,赋值给kwargs

命名空间与作用域

函数对象:

  • 可以把函数当成参数传入
  • 可以把函数当做返回值返回

函数的嵌套定义:在函数内定义函数

闭包函数:父函数的返回值为一个函数,被返回的函数调用了父函数的局部变量,且该函数可以在父函数外部执行

装饰器:

装饰器:定义一个为其他函数添加功能的函数

为什么要使用装饰器?

  • 开放封闭原则:开放扩展功能但封闭源代码的修改
  • 装饰器就是在不修改装饰对象源代码以及调用方式的前提下,为装饰对象添加新功能

装饰器实现:

需求:不修改源代码,计算代码执行时间

 源代码:

运行结果:

0
1
方案一 运行时间:1.001857042312622
2
方案二 运行时间:1.0040733814239502
3
方案三 运行时间:1.0017154216766357
4
方案四 运行时间:1.007995367050171
5
方案五 运行时间:1.0145602226257324
6
方案六 运行时间:1.0046615600585938
7
方案七 运行时间:1.0094060897827148

2.语法糖

  • 使用语法糖,需要将装饰器放到被装饰对象前

运行结果:

hello
运行时间:1.0050427913665771
wrapper

3.装饰器模板

扩展:真正实现偷梁换柱,调用者无感知

  • 不使用装饰器

运行结果:

hello
func0
help on function func0 in module main:

func0(x)
这是函数

none

使用装饰器:

运行结果:

hello
运行时间:1.011878490447998
wrapper
help on function wrapper in module main:

wrapper(*args, **kwargs)
这是装饰器

none

呕吼,露馅了

  • 解决方法,将原函数的属性和方法,赋值给装饰器内的wrapper

运行结果:

hello
运行时间:1.0030155181884766
func0
help on function func0 in module main:

func0(*args, **kwargs)
这是函数

none

但是,函数有很多属性和方法,一个一个手动修改过于麻烦,甚至可能会遗漏,但python也提供了解决方法

运行结果:

hello
运行时间:1.0114128589630127
func0
help on function func0 in module main:

func0(x)
这是函数

none

4.有参装饰器

  • 装饰器内需要传入参数,但是由于语法糖的限制,装饰器只能有一个参数,并且该参数仅用来接收被装饰对象的内存地址,如何传入其他参数?
  • 解决思路:将装饰器做成闭包函数
  • 将传入的参数写入语法糖
  • 模板

到此这篇关于深入了解python装饰器的文章就介绍到这了,更多相关python装饰器内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!