简单理解Python中的装饰器

作者:Yi_Zhi_Yu 时间:2021-06-18 01:44:21 

Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没有任何的改变。


首先, 我们先定义一个函数, 这个函数可以输出我的个人昵称:


def my_name():
 print "Yi_Zhi_Yu"
my_name() # Yi_Zhi_Yu

那假如我需要在个人昵称输出前, 在输出我的个人uid呢, 当然, 要求是不改动现有的my_name函数, 这个时候就可以使用装饰器了

首先, 装饰器也是个函数, 其次, 他需要接受一个参数,该参数表示了要被装饰的函数(即my_name):


def my_info(func):
 def wrapper(*args, **params):
   print 218
   return func(*args, **params)
 return wrapper

然后与相应的被装饰函数关联起来的方法就是使用@my_info写在被装饰函数的前面


@my_info
def my_name():
 print "Yi_Zhi_Yu"

最后, 在执行my_name的时候, 就能既输出我的uid, 又能输出我的昵称了


my_name()
#218
#Yi_Zhi_Yu

在上面, 最让我们疑惑的是装饰器函数定义里面的wrapper函数, 装饰器本身返回的是wrapper函数的定义, 而wrapper中则定义了对被装饰函数(my_name)的调用, func表示的就是被装饰函数, 说白了, 装饰器只是把某个不得改动的函数(a)放到另一个函数(b)中, 在b里面调用a, 在调用前后就可以做所谓的看起来像装饰的工作了。
my_info的最终返回的wrapper函数的定义, 并不是执行结果,只有当wrapper真正执行的时候, 才会真正的执行my_name方法, 这就是闭包时所说的内容。
wrapper中的参数, 实际上则是传递给func(实际上是my_name)的参数

因为装饰器也是个函数, 那么装饰器自己的能不能有参数传递呢。可以, 不过需要定义一个更高阶的函数, 也就是外面还要套一层函数, 比如, 我还要输出我的自定义的一个信息,需要传递参数


def c_info(text):
 def my_info(func):
   def wrapper(*args, **params):
     print text
     print 218
     return func(*args, **params)
   return wrapper
 return my_info


#使用装饰器

@c_info("Tony")
def my_name():
 print "Yi_Zhi_Yu"

my_name()
#Tony
#218
#Yi_Zhi_Yu

与前面的那个装饰器相比, 仅仅是多了个外层, 内层也仅仅是增加了对外层传入参数(text)的调用

总而言之, Python在函数定义中支持了对oop思想中的装饰器的实现, 其本质也只是使用了闭包的思路, 延迟调用, 并在调用前后增加自己的其他实现内容

Ps: 以上皆为学习笔记, 附带自己的理解, 难免有偏差, 如有发现纰漏, 还望指正

标签:Python,装饰器
0
投稿

猜你喜欢

  • Python面向对象编程之类的继承

    2021-10-27 23:46:39
  • Javascript Ajax异步读取RSS文档具体实现

    2024-05-09 10:36:56
  • tensorflow之读取jpg图像长和宽实例

    2023-10-12 11:57:41
  • Python import用法以及与from...import的区别

    2021-06-13 14:23:51
  • golang-redis之sorted set类型操作详解

    2024-02-02 05:19:20
  • python中Mako库实例用法

    2022-01-05 16:38:21
  • 使用vue.js写一个tab选项卡效果

    2024-04-22 22:23:34
  • Mysql使用sum()函数返回null的问题详解

    2024-01-17 03:20:04
  • Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】

    2023-11-11 06:41:39
  • python实现知乎高颜值图片爬取

    2023-03-11 10:35:54
  • Centos7 下Mysql5.7.19安装教程详解

    2024-01-25 08:28:18
  • vue动态设置页面title的方法实例

    2023-07-02 16:38:56
  • MYSQL GROUP BY用法详解

    2024-01-29 10:22:05
  • Python-OpenCV教程之图像的位运算详解

    2022-10-17 23:44:43
  • 使用Python的Scrapy框架编写web爬虫的简单示例

    2023-08-03 12:37:50
  • eWebEditor 辑器按钮失效 IE8下eWebEditor编辑器无法使用的解决方法

    2023-06-27 07:07:26
  • 浅谈vue中使用编辑器vue-quill-editor踩过的坑

    2024-04-10 13:46:00
  • ASP将Excel数据导入到SQLServer的实现代码

    2011-03-10 10:38:00
  • Go GORM 事务详细介绍

    2024-02-21 21:03:05
  • 完美的渐变透明效果,支持Firefox

    2008-06-18 18:18:00
  • asp之家 网络编程 m.aspxhome.com