当前位置: 首页 > news >正文

统一门户网站南昌p2p网站建设公司

统一门户网站,南昌p2p网站建设公司,wordpress 后台乱码,什么是网站单页python装饰器的本质#xff0c;就是闭包#xff01;我们一般谈Python的闭包#xff0c;都是指普通的入参#xff0c;而谈装饰器的时候#xff0c;入参一定有函数#xff01;闭包和装饰器#xff0c;返回的都是函数。函数是代码的最小封装单位#xff0c;装饰器作用于函…python装饰器的本质就是闭包我们一般谈Python的闭包都是指普通的入参而谈装饰器的时候入参一定有函数闭包和装饰器返回的都是函数。函数是代码的最小封装单位装饰器作用于函数它不影响函数自身的执行只是在函数的执行前后增加一些“装饰性”的动作。装饰器被称为python的语法糖(syntax sugar)也被视为python支持AOP编程(面向切面编程)的工具。简单装饰器以下代码实现了一个最简单的额装饰器功能是给带上装饰器的函数在函数执行前增加一行print打印代码如下test1函数加上了calling_trace装饰器在第7行这一行代码的作用相同于第11行的注释。test1还是test1这个名字没有变只是换成了一个闭包函数的返回值此闭包函数就是装饰器它接收一个函数作为参数。以上代码运行效果如下$ python3 deco.pycalling test1test1 is runing...我们还可以稍微复杂一点点既然是装饰器被装饰的函数执行前后都可以加点小动作。修改后的代码如下def calling_trace(func):def wrapper():print(calling, func.__name__)a func()print(this is the reture:,a)return wrappercalling_tracedef test2():print(test2 is runing...)return www.pynote.net# test2 calling_trace(test2)test2()新的装饰器没有改名字只是获取了被装饰函数的返回值并将返回值打印出来。运行效果如下$ python3 deco.pycalling test2test2 is runing...this is the reture: www.pynote.nettest2函数执行前后都增加了一些动作作为装饰这就是装饰器的概念不修改已有函数的代码也不修改已有函数的调用处代码却达到了丰富函数功能的效果本质上装饰器是对函数的一种封装只是我们要理解语法。闭包和装饰器装饰器的本质就是闭包我们如果把上面这段代码重写一遍采用闭包的语法形式不使用语法效果是完全一样的def calling_trace(func):def wrapper():print(calling, func.__name__)a func()print(this is the reture:,a)return wrapperdef test2():print(test2 is runing...)return www.pynote.nett calling_trace(test2)t()以上代码没有语法的使用啦用变量t来获取calling_trace返回的函数对象然后调用效果与使用装饰器完全一样$ python3 deco.pycalling test2test2 is runing...this is the reture: www.pynote.net使用语法阅读代码就如吃糖装饰带参数的函数如果被装饰的函数有参数需要在装饰器内部原样复制函数的参数定义。请看示例def calling_trace(func):def wrapper(a,b,c3):print(calling, func.__name__)a func(a,b,c)print(reture value:,a)return wrappercalling_tracedef test3(a,b,c3):print(test3 is runing...)return abctest3(1,2,5)test3(1,2)装饰器返回的函数的参数定义要与被装饰函数的参数定义保持一致以上代码运行结果如下$ python3 deco.pycalling test3test3 is runing...reture value: 8calling test3test3 is runing...reture value: 6就算装饰参数个数不定的函数语法上也是一样的请看下面代码test4函数的参数个数不定def calling_trace(func):def wrapper(*args):print(calling, func.__name__)a func(*args)print(reture value:,a)return wrappercalling_tracedef test4(*args):print(test4 is runing...)return sum(args)test4(1,2,3,4,5,6,7,8)test4(23,34,45,56)*args表示一个tuple在函数定义处出现就是packing打包调用时的参数在调用时出现就是unpacking展开tuple。跟**kw(对应dict)用法一样。以上代码运行效果$ python3 deco.pycalling test4test4 is runing...reture value: 36calling test4test4 is runing...reture value: 158给带参数的函数加装饰器还有一种更通用更常见的参数写法这种写法在修改函数参数和调用处时有可以反过来保持装饰器部分代码不变。示例如下def calling_trace(func):def wrapper(*args, **kw):print(calling, func.__name__)a func(*args, **kw)print(reture value:,a)return wrappercalling_tracedef test5(a,b,c3):print(test5 is runing...)return abctest5(1,2)test5(1,2,c8)装饰器中使用*args和**kw来接收和传递参数这个地方要好好体会这是python的一个特别精妙的地方。以上代码运行结果如下$ python3 deco.pycalling test5test5 is runing...reture value: 6calling test5test5 is runing...reture value: 11带参数的装饰器本文以上示例都是不带参数的装饰器在使用语法的时候没有参数。而装饰器本身也可以带参数通过在装饰器外再使用闭包给装饰器封装其执行环境可以使装饰器的功能更强大更灵活也可以更好的控制函数的执行(比如在某些情况下不执行)。而带参数的装饰器在语法上也就跟闭包区分开来。(应该就是这个原因闭包和装饰器在python中是分成了两个概念)def calling_trace(run):def deco(func):def wrapper(*args, **kw):print(calling, func.__name__)if run 1:a func(*args, **kw)print(reture value:,a)else:print(not allow to run)return wrapperreturn deco# test5 calling_trace(run1)(test5)calling_trace(run1)def test5(a,b,c3):print(test5 is runing...)return abccalling_trace(run0)def test6(*args):print(test6 is runing...)return sum(args)test5(1,2)test5(1,2,c8)test6(23,34,45,56)先看一下这段代码的运行结果$ python3 deco.pycalling test5test5 is runing...reture value: 6calling test5test5 is runing...reture value: 11calling test6not allow to run达到预期test5可以执行而test6不允许执行。calling_trace实际上就是一个闭包它有一个参数run调用calling_trace(run1)后就相当于返回了一个有run这个参数的装饰器。然后再用这个装饰器去“修饰”它自己的参数func。这个效果就如注释掉的那行代码。如果不使用语法把那行代码注释打开(放在test5的定义后面)运行效果一模一样多重装饰器函数可以有多个装饰器多个装饰器的效果就相当于对函数进行了多层的封装包裹而不同的装饰器对函数执行的功能影响完全独立。比如有个装饰器用来控制函数是否能够被执行另一个装饰器控制函数的所有raise出来的异常。abcdef tt(): pass# tt a(b(c(tt)))tt函数上面带3个装饰器想过正如注释掉的那行代码。我真的觉得python装饰器的设计实在是非常精妙-- EOF --
http://www.huolong8.cn/news/80925/

相关文章:

  • 广东长城建设集团有限公司 网站app首页设计效果图
  • 福安网站开发四川高速公路建设集团网站
  • 云服务器做网站一般配置广州越秀区风险等级
  • 设计图片网站哪个好哪个网站可以免费做H5
  • 衡阳公司做网站做视频网站需要什么证件
  • 用mui做的网站乐清网
  • 聊城哪里有做网站的网络公司排名中国
  • 自建网站系统wordpress导航功能
  • 网站的系统帮助塘沽做网站公司
  • wordpress网站百度数据大连开发区做网站
  • 深圳网站建设代理wordpress修改标题链接
  • 网站建设的文件深圳设计公司
  • 四川省建设厅职称查询网站ppt设计主题
  • 北京网站制作最新教程做外贸找客户的网站
  • 大厂建设局网站珠海手机网站建设价格
  • 做拍卖网站怎么样天眼网查询个人信息
  • 制作一个网站数据库怎么做百度搜索引擎下载免费
  • 北京市住房和城乡建设部网站首页网站建设犭金手指a15
  • wordpress装修套餐网站源码乐装网
  • 英文网站建设报价模板价格多少钱一平方
  • 织梦中英文版网站怎么做怎么清空WordPress
  • 视频网站建设费用明细网站开发税率
  • 安徽省建设厅网站怎么进不去网页升级请记住新域名
  • 电商网站开发过程什么是网络营销媒体
  • 沧州有做网站的吗服务器网站怎么做的
  • 服务器出租网站模板猎头公司怎么样
  • 凡科怎样免费做网站网络购物系统属于什么系统
  • 可信网站图标 费流量下载软件大全
  • 如何做网站推广的方案设计图片制作视频手机软件
  • 哈尔滨专业做网站签名字体在线生成器