简单理解Python中的装饰器

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_infodef my_name():  print "Yi_Zhi_Yu"

登录后复制

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

立即学习“Python免费学习笔记(深入)”;

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: 以上皆为学习笔记, 附带自己的理解, 难免有偏差, 如有发现纰漏, 还望指正

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2300862.html

(0)
上一篇 2025年2月28日 04:57:04
下一篇 2025年2月28日 04:57:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何使用Vue.js和Python实现智能推荐系统和个性化服务的方法和实践经验

    如何使用vue.js和python实现智能推荐系统和个性化服务的方法和实践经验 引言:随着互联网的迅速发展,用户在网上获取信息的方式越来越多样化。为了提供更好的用户体验,智能推荐系统和个性化服务应运而生。本文将介绍如何使用vue.js和py…

    编程技术 2025年3月30日
    100
  • Bootstrap页面如何预览

    Bootstrap页面的预览方法有:直接在浏览器中打开HTML文件;使用Live Server插件自动刷新浏览器;搭建本地服务器模拟线上环境。 Bootstrap页面预览?这问题问得妙啊!很多新手都会被这个问题卡住,其实方法多着呢,关键在于…

    2025年3月30日
    100
  • 如何保存Bootstrap的查看结果

    保存 Bootstrap 查看结果的方法有多种:保存 HTML 页面:浏览器中另存为,但可能出现样式偏差。保存源码:保存 HTML、CSS、JavaScript 文件,有利于调试和修改。截图:仅保存静态画面,无法体现交互效果。使用浏览器开发…

    2025年3月30日
    100
  • PS卡在载入界面怎么办?

    PS卡在载入界面可能是由软件自身(文件损坏或插件冲突)、系统环境(驱动过时或系统文件损坏)或硬件(硬盘损坏或内存条故障)问题造成的。首先检查计算机资源是否充足,关闭后台程序释放内存和CPU资源。修复PS安装或检查插件是否存在兼容性问题。更新…

    2025年3月30日
    100
  • PS一直显示正在载入是什么原因?

    PS“正在载入”问题是由资源访问或处理问题引起的:硬盘读取速度慢或有坏道:使用CrystalDiskInfo检查硬盘健康状况并更换有问题的硬盘。内存不足:升级内存以满足PS对高分辨率图片和复杂图层处理的需求。显卡驱动程序过时或损坏:更新驱动…

    2025年3月30日
    100
  • PS启动时一直显示正在载入如何解决?

    PS启动时卡在“正在载入”可能是由于各种原因造成的:禁用损坏或冲突的插件。删除或重命名损坏的配置文件。关闭不必要的程序或升级内存,避免内存不足。升级到固态硬盘,加快硬盘读取速度。重装PS修复损坏的系统文件或安装包问题。查看错误日志分析启动过…

    2025年3月30日
    100
  • PS打开文件时一直显示正在载入如何解决?

    PS打开文件时出现“正在载入”卡顿,原因可能包括:文件过大或损坏、内存不足、硬盘速度慢、显卡驱动问题、PS版本或插件冲突。解决方法依次为:检查文件大小和完整性、增加内存、升级硬盘、更新显卡驱动、卸载或禁用可疑插件、重装PS。通过逐步排查,并…

    2025年3月30日
    100
  • 如何加快PS的载入速度?

    解决 Photoshop 启动慢的问题需要多管齐下,包括:升级硬件(内存、固态硬盘、CPU);卸载过时或不兼容的插件;定期清理系统垃圾和过多的后台程序;谨慎关闭无关紧要的程序;启动时避免打开大量文件。 Photoshop启动慢?这问题我太熟…

    2025年3月30日
    100
  • PS载入慢与电脑配置有关吗?

    PS载入慢的原因在于硬件(CPU、内存、硬盘、显卡)和软件(系统、后台程序)的综合影响。解决方法包括:升级硬件(尤其是更换固态硬盘),优化软件(清理系统垃圾、更新驱动、检查PS设置),处理PS文件。定期维护电脑也有助于提升PS运行速度。 P…

    2025年3月30日
    100
  • PS载入慢与硬盘速度有关吗?

    硬盘速度可能导致 PS 启动缓慢,但并非唯一原因。启动过程涉及多种任务,例如资源解压、插件加载和数据结构初始化,其中任何环节卡壳都会延长启动时间。系统配置(内存不足、CPU 性能不足)、系统问题以及安装位置也会影响启动速度。综合考虑硬件配置…

    2025年3月30日
    100

发表回复

登录后才能评论