您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

让python decorator不再晦涩难懂。 [互站网]

  • 时间:2022-10-14 13:11 编辑: 来源: 阅读:295
  • 扫一扫,手机访问
摘要:让python decorator不再晦涩难懂。 [互站网]
在学习decorator函数之前,先考虑以下两种情况:a .有一个函数fn,我们无法修改函数的源代码,但是如何扩展函数?我们可以定义一个新的函数deco,然后进行fn=deco(fn)这样的赋值操作,这样在调用原来的fn的时候,实际上执行的是deco(fn)的操作。如果这种方法可行,我们就面临以下问题:deco函数必须接受一个函数作为参数,deco函数也必须返回一个函数。显然,接受的函数必须是函数fn,返回的函数不仅是 所以deco函数的结构可以如下:def deco (fn): def wrapper (* args,* * kwargs): #这里参数的目的是传递给fn函数。密码...#新功能代码,如果有任何fn (* args,* * kwargs)代码...# newfunction代码if anyreturnwrapper #调用如下:fn=deco(fn)fn(*args,**kwargs) #不改变fn函数的调用方法。b .有一个函数包装器,如何在不改变这个函数的调用方法的情况下,给函数包装器传递额外的参数?我们可以通过赋值来改变包装器,比如wrapper=func(args),其中args是我们要传递的额外参数,func是一个新函数。这个func函数需要接受我们要传递的额外参数args,同时返回一个函数,返回的函数应该是包装函数。至于传递的参数args是如何给包装器函数的,需要在包装器代码中接受。一种可能的结构如下:def func (args): code.....# code if any required . tmp _ para = args #使用tmp接受额外参数args def wrapper():extra _ para = tmp _ para #实现要传递给包装函数的额外参数args。密码...#包装函数的代码 返回包装代码......#如果存在,这部分代码可以是与参数s相关的#调用方法如下:wrapper=func(args) #args是附加参数wrapper(*args,**kwargs) #是包装器本身的参数。以上两种情况,我们分别实现了:a .通过赋值fn=deco(fn),在不改变函数源代码的情况下,扩展了函数fn的功能。b .通过赋值wrapper=func(args),使用新函数func向包装函数传递额外的参数,但必须修改包装函数的源代码。如果包装器函数的源代码不能修改,那么向包装器传递额外的参数有什么意义呢?下面举个例子:#!/usr/bin/env python# -*-编码:utf-8-*-#作者:PandaEyedef欢迎使用(名字):#一个非常简单的函数。print("欢迎来到我的博客:%s!"% name)def wrapper(gift):ext _ para = gift #额外参数为:gift,将其传递给函数deco。def deco(fn):# deco扩展功能,不改变fn的代码。def fun(*args,**kwargs): print("我是新功能,再送你10分祝贺!")fn(*args,**kwargs) print("恭喜你,你得了第1名,把礼物%s送给你!"% ext _ para)return fun return decode co = wrapper(" BMW ")welcome = deco(welcome)welcome("马骁")在上面的例子中,函数welcome在主程序中的调用方法从未改变过。但是函数进行了两次扩展:一是利用deco函数进行扩展。在第一次deco展开的基础上,我们需要传递一个额外的参数gift给deco,这个参数gift显然不能直接传递给deco。因为deco接受的参数必须是fn,所以我们使用包装函数来传递它。在将这个参数传递给deco之后,我们修改deco。由于deco必须解决这个输入参数,因此有必要修改deco。 到目前为止,已经完成了两次扩建。知道了上面的流程,其实就知道了decorator函数,decorator函数:decorator函数其实是把上面两行的赋值代码改成@wrapper("BMW "),然后调整位置。 我个人比较喜欢写decorator函数:从deco函数开始,然后做第二次扩展(也就是为deco函数传递参数)。这是外围包装函数。deco和wrapper函数编写完成后,decorator函数就完成了。下面是上面例子中装饰者常用的写法,彼此非常相似。知道了上面的调用,就知道这个decorator函数了。#!/usr/bin/env python #-*-coding:utf-8-*-# Author:PandaEyedef wrapper(gift):ext _ para = gift #额外参数是:gift,将其传递给函数deco。def deco(fn):# deco扩展功能,不改变fn的代码。def fun(*args,**kwargs): print("我是新功能,再送你10分祝贺!")fn(*args,**kwargs) print("恭喜你,你得了第1名,把礼物%s送给你!"% ext _ para)return fun return deco # deco = wrapper(" BMW ")# welcome = deco(welcome)@ wrapper(" BMW ")#该语句与上两个语句的作用相同,这是一个装饰函数的常用表达式。在调用decorator函数之前,必须先定义它,所以包装函数定义必须在这句话之前,否则会报错:def welcome(name):# avery simple function . print(" welcome to my blog:% s!"% name)欢迎(“马骁”)本文为原创。转载请注明出处!


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)
【技术支持|常见问题】你正确使用https了吗? [php源码](2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部