范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

装饰器原来如此简单(python)

  python装饰器–原来如此简单
  今天整理装饰器,内嵌的装饰器、让装饰器带参数等多种形式,非常复杂,让人头疼不已。但是突然间发现了装饰器的奥秘,原来如此简单… 第一步 :从最简单的例子开始### -*- coding:gbk -*- """示例1: 使用语法糖@来装饰函数,相当于"myfunc = deco(myfunc)" 但发现新函数只在第一次被调用,且原函数多调用了一次"""  def deco(func):     print("before myfunc() called.")     func()     print("  after myfunc() called.")     return func   @deco def myfunc():     print(" myfunc() called.")  myfunc() myfunc()
  这是一个最简单的装饰器的例子,但是这里有一个问题,就是当我们两次调用myfunc()的时候,发现装饰器函数只被调用了一次。为什么会这样呢?要解释这个就要给出破解装饰器的关键钥匙了。
  这里@deco这一句,和myfunc = deco(myfunc)其实是完全等价的,只不过是换了一种写法而已
  一定要记住上面这句!!!!
  好了,从现在开始,只需要做替换操作就可以了。
  将@deco 替换为 myfunc = deco(myfunc)
  程序首先调用deco(myfunc),得到的返回结果赋值给了myfunc (注意:在Python中函数名只是个指向函数首地址的函数指针而已)
  而deco(myfunc)的返回值就是函数myfunc()的地址
  这样其实myfunc 没有变化,也就是说,最后的两次myfunc()函数调用,其实都没有执行到deco()。
  有同学就问了,明明打印了deco()函数里面的内容啊,怎么说没有调用到呢。这位同学一看就是没有注意听讲,那一次打印是在@deco 这一句被执行的。大家亲自动手试一下就会发现" myfunc() called." 这句打印输出了三次。多的那次就是@deco这里输出的,因为@deco 等价于myfunc = deco(myfunc),这里已经调用了deco()函数了。 第二步 :确保装饰器被调用
  怎么解决装饰器没有被调用的问题呢 # -*- coding:gbk -*- """示例2: 使用内嵌包装函数来确保每次新函数都被调用, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象"""  def deco(func):     def _deco():         print("before myfunc() called.")         func()         print("  after myfunc() called.")         # 不需要返回func,实际上应返回原函数的返回值     return _deco  @deco def myfunc():     print(" myfunc() called.")     return "ok"  myfunc() myfunc()
  这里其实不需要我解释了,还是按照第一步中的方法做替换就可以了。还是啰嗦几句吧…
  @deco 替换为 myfunc = deco(myfunc)
  程序首先调用deco(myfunc),得到的返回结果赋值给了myfunc ,这样myfunc 就变成了指向函数_deco()的指针
  以后的myfunc(),其实是调用_deco() 第三步 :对带参数的函数进行装饰
  破案过程和第一步、第二步完全一致,不再重复了 # -*- coding:gbk -*- """示例5: 对带参数的函数进行装饰, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象"""  def deco(func):     def _deco(a, b):         print("before myfunc() called.")         ret = func(a, b)         print("  after myfunc() called. result: %s" % ret)         return ret     return _deco  @deco def myfunc(a, b):     print(" myfunc(%s,%s) called." % (a, b))     return a + b  myfunc(1, 2) myfunc(3, 4) 第四步 :让装饰器带参数# -*- coding:gbk -*- """示例7: 在示例4的基础上,让装饰器带参数, 和上一示例相比在外层多了一层包装。 装饰函数名实际上应更有意义些"""  def deco(arg):     def _deco(func):         def __deco():             print("before %s called [%s]." % (func.__name__, arg))             func()             print("  after %s called [%s]." % (func.__name__, arg))         return __deco     return _deco  @deco("mymodule") def myfunc():     print(" myfunc() called.")  @deco("module2") def myfunc2():     print(" myfunc2() called.")  myfunc() myfunc2()
  这种带参数的装饰器怎么解释呢。其实是一样的,还是我们的替换操作
  @deco("mymodule")替换为myfunc = deco("mymodule")(myfunc )
  注意啊,这里deco后面跟了两个括号。
  有同学要问了,这是什么意思?
  其实很简单,先执行deco("mymodule"),返回结果为_deco
  再执行_deco(myfunc),得到的返回结果为__deco
  所以myfunc = __deco
  破案!

特斯拉屏幕深夜自动播放我死得好冤啊吓坏车主,各方回应夜晚,地下停车场,郑女士的双手长按在她的特斯拉MODEL3方向盘的两个按钮上,屏幕熄灭,系统进入重启程序。突然,黑色中控屏的屏幕上显示出一个绿色的麦克风,郑女士伸出手点了一下,环绕OPPOK10Pro体验骁龙888下放,小金刚变身大金刚4月24日,OPPO举办了K10系列超次元新品发布会,正式发布了全新的K10系列两款新机OPPOK10和OPPOK10Pro,其中,K10首发天玑8000MAX芯片,而Pro版本,央行撒钱了!2000亿资金剑指这一大领域,主力提前埋伏来源数据宝央行出手,释放2000亿再贷款资金,支持专精特新。4月28日晚间,央行发文中国人民银行设立科技创新再贷款引导金融机构加大对科技创新的支持力度。为贯彻落实党中央国务院决策部5月新规来了!广东各地要发消费券广东新规广东发布促消费措施日前,广东省政府办公厅印发广东省进一步促进消费若干措施,其中规定,未出台促消费政策的地市必须在5月1日前制定具体实施方案,开展促消费活动。广东将鼓励购置新越发达的国家,为何越不流行移动支付?背后的原因引人深思微信支付以及支付宝支付,在国内的支付领域当中平分秋色。但是在越发达的国家,其实越少看到微信支付以及支付宝支付的身影,无现金时代不一定是真的危险,反而是移动支付会根据国家的发展情况有是欲壑难平?还是另有原因?通过刘强东案,我们能看到些什么?近日,刘强东涉嫌性侵案又起波澜。有媒体爆料称此案将在美国举行公开听证会。原本我们以为这件事会不了了之了,但是随着美国警方案件重启调查和录音的曝光,时吉利手机外观专利通过,摄像头设计别出心裁,你喜欢吗之前就传闻车企吉利收购了某手机品牌,可以说作为车企在物联网时代已经开始布局整个生态了,最近,有爆料称吉利或将有手机发布了!最近,有网友发现在国家知识产权局官网中出现了与吉利相关联的大片随手即可拍,三星GalaxyS22系列手机解锁影像新玩法智能手机发展至今,其时间并不长。但由于科技发展的速度,导致手机的更新换代速度提速了不少。当下手机的影像功能备受关注。而作为深耕国内市场多年的三星,其新上市的三星GalaxyS22系面临供应链挑战苹果股价下跌亚马逊第一季亏损股价暴跌9面临供应链挑战苹果股价下跌苹果周四(4月28日)公布截至3月结束的本财年第二季财报,营收为973亿美元,成长8。6。但随着中国疫情封城使生产和需求停滞,俄乌战争影响销售,公司预计将2万以内最全98寸产品对比分析,拿去不谢电视大屏化是必然趋势,近两年买电视一定要往大了买,否则后悔的是自己!中国电子视像协会最新电视机尺寸推荐标准客厅两米五,电视选75客厅两米九,85要拥有客厅三米三,98往家搬当然上面摩托罗拉edgeS40曝光5600mAh电池18G运存,真香预定随着制造工艺的不断进步,全面屏手机有了前所未有的发展,因此在如今的手机市场中,我们可以看到很多设计优秀的全面屏手机。大家都知道,摩托罗拉手机是一个非常有历史底蕴的手机厂商,是一个在
大公司早报B站回应视频监控被破解上传未成年人寒假最多游戏14小时(整理胡毓靖)今天是1月18日星期二,过去24小时的大公司新闻包括京东2022年将招聘超两万名高校毕业生快手原CEO宣布退休,金秉接任字节跳动收购影托邦和一直看漫画屈臣氏因虚假价格春运期间铁路部门提供24小时互联网退票服务来源新京报春运期间铁路部门提供24小时互联网退票服务春运2022年春运今日开始至2月25日结束,共计40天。根据火车票15天预售期安排,今天可以购买1月31日除夕当日的火车票。铁路内蒙古自治区首家24小时在线互联网医院上线内蒙古日报1月16日讯(见习记者王坤)1月15日,全区首家开展24小时在线问诊的互联网诊疗服务平台内蒙古自治区中医医院互联网医院正式上线。据了解,患者通过互联网医院网络诊室可以实现使用USANA护肤品是一种怎样的体验?不!谢谢邀请。爱豆Lee今天跟大家来分享一下。使用USANA护肤品是一种怎样的体验?前几个月买了USANA的一套护肤品,已经用了20天。主要变化是皮肤不像以前那么黄了,而且开始有光一部手机可以用几年?这几个习惯决定了换机频率一部手机最多用几年,这个话题我很早就跟大家分享过。有一位长辈,现在还在使用诺基亚按键机,十几年了还是能接电话发短信,手机的寿命十几年也不是什么稀罕事。本文跟大家聊的不是手机最多用几当你一无所有还负债累累,目前有没有能力偿还,天天被催债该怎么办?你说的就是我,我18年开始全面逾期,十几张信用卡,还有一些零零散散的网贷,刚开始逾期当天,还没过,还没真的逾期,就开始被暴力催收,白天直到晚上大概九点多,上班时候电话都全程静音,还考研党想入手一个ipad,求推荐一个性价比高的型号,价格在3000左右,能具备日常的学习就可以?ipad只有一款是3000元的,ipad2021,其他都超过3000元,还有啥好选的。如果你是要买平板电脑,ipad和华为和小米的都行oppo和vivo就别买了,OV的平板骁龙66为什么华为跌倒后,有人宁愿溢价买苹果,也不买性价比高的小米?小米和苹果在一个层次上吗?在国内,只有华为可以压制苹果,其它的加在一块也不够人家打!感谢您的阅读。为什么有人宁愿溢价买苹果,也不考虑性价比高的小米?您的这个问题,可以推广到很多手机网友无聊拆掉小米路由器4惊现为发烧而生AreYouOK!!!近期有网友表示,,无聊将四年前的小米路由器4拆了,发现小米在电路板上印刷了为发烧而生以及AREYOUOK!!!,这两句熟悉的口号曾经伴随小米粉丝度过了很多年。据资料显示,AREYO为什么有人宁愿溢价买苹果,也不考虑性价比高还有现货的小米?感谢邀请为什么有人宁愿溢价买苹果,也不考虑性价比高还有现货的小米?我最近看到了这样的一条新闻,说的是苹果连续六周在国内市场销量第一名的位置。而且其中有写到在10月份的时候,iPho虚拟数字人扎堆亮相商业化仍艰难探索本报记者曲忠芳李正豪北京报道虚拟偶像智能助理数字员工虚拟大学生各种各样的虚拟数字人,近两年来密集出现在各大社交平台,并参与到我们的经济和社会生活中。中国经营报记者注意到,尤其在元宇