恶补了 Python 装饰器的六种写法,你随便问~.docxVIP

恶补了 Python 装饰器的六种写法,你随便问~.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
恶补了 Python 装饰器的六种写法,你任凭问~ 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下添加额外功能,装饰器的前往值也是一个函数对象。 它经常用于有切面需求的场景,比如:插入日志、功能测试、事务处理、缓存、权限校验等场景。 装饰器是处理这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并连续重用。 装饰器的使用方法很固定 先定义一个装饰器(帽子) 再定义你的业务函数或者类(人) 最终把这装饰器(帽子)扣在这个函数(人)头上 就像下面这样子 #?定义装饰器 def?decorator(func): ????def?wrapper(*args,?**kw): ????????return?func() ????return?wrapper #?定义业务函数并进行装饰 @decorator def?function(): ????print(hello,?decorator) 实际上,装饰器并不是编码必需性,意思就是说,你不使用装饰器完全可以,它的消灭,应当是使我们的代码 愈加优雅,代码结构愈加清楚 将实现特定的功能代码封装成装饰器,提高代码复用率,添加代码可读性 接下来,我将以实例讲解,如何编写出各种简约及简单的装饰器。 第一种:一般装饰器 首先咱来写一个最一般的装饰器,它实现的功能是: 在函数执行前,先记录一行日志 在函数执行完,再记录一行日志 #?这是装饰器函数,参数?func?是被装饰的函数 def?logger(func): ????def?wrapper(*args,?**kw): ????????print(我预备开头执行:{}?函数了:.format(func.__name__)) ????????#?真正执行的是这行。 ????????func(*args,?**kw) ????????print(仆人,我执行完啦。) ????return?wrapper 假如,我的业务函数是,计算两个数之和。写好后,直接给它带上帽子。 @logger def?add(x,?y): ????print({}?+?{}?=?{}.format(x,?y,?x+y)) 然后执行一下 add 函数。 add(200,?50) 来看看输出了什么? 我预备开头执行:add 函数了: 200?+?50?=?250 我执行完啦。 其次种:带参数的函数装饰器 通过上面两个简约的入门示例,你应当能体会到装饰器的工作原理了。 不过,装饰器的用法还远不止如此,深究下去,还大有文章。今日就一起来把这个学问点学透。 回过头去看看上面的例子,装饰器是不能接收参数的。其用法,只能适用于一些简约的场景。不传参的装饰器,只能对被装饰函数,执行固定规律。 装饰器本身是一个函数,做为一个函数,假如不能传参,那这个函数的功能就会很受限,只能执行固定的规律。这意味着,假如装饰器的规律代码的执行需要依据不同场景进行调整,若不能传参的话,我们就要写两个装饰器,这明显是不合理的。 比如我们要实现一个可以定时发送邮件的任务(一分钟发送一封),定时进行时间同步的任务(一天同步一次),就可以本人实现一个 periodic_task (定时任务)的装饰器,这个装饰器可以接收一个时间间隔的参数,间隔多长时间执行一次任务。 可以这样像下面这样写,由于这个功能代码比较简单,不利于学习,这里就不贴了。 @periodic_task(spacing=60) def?send_mail(): ?????pass @periodic_task(spacing=86400) def?ntp() ????pass? 那我们来本人制造一个伪场景,可以在装饰器里传入一个参数,指明国籍,并在函数执行前,用本人国家的母语打一个招呼。 #?小明,中国人 @say_hello(china) def?xiaoming(): ????pass #?jack,美国人 @say_hello(america) def?jack(): ????pass 那我们假照实现这个装饰器,让其可以实现 传参 呢? 会比较简单,需要两层嵌套。 def?say_hello(contry): ????def?wrapper(func): ????????def?deco(*args,?**kwargs): ????????????if?contry?==?china: ????????????????print(你好!) ????????????elif?contry?==?america: ????????????????print(hello.) ????????????else: ????????????????return ??????????

文档评论(0)

liuxiyuliuxingyu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档