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

Python装饰器的细化讲解

  我叫骆驼
  会点儿代码,会点儿读书
  这世上的书浩如烟海
  我能做的就是尽量整理分享给你  起
  在上一节Flask项目实战第一弹中我们讲到了路由,先看下面代码回顾一下:from flask import Flask  app = Flask(__name__)   @app.route("/hello") def hello():     return "

Hello World ..." if __name__ == "__main__": app.run(load_dotenv=True)   @app.route("/hello") 就是装饰器。交流群里小伙伴问我,Python里的装饰器该怎么理解,今天我们好好唠唠这个东西。承   说到装饰器,我们不得不谈一个知识点:闭包。我们从代码入手,一点一点来说闭包。   Python 有一个好玩的地儿,就是 def 函数(exterior)内部可以嵌套另一个 def 函数(interior)。调用 exterior 时,若遇到 interior , 仅仅完成对于 interior 的定义,而不去运行 interior。如果 exterior return interior,那么我们可以使用 interior () 去调用 内部函数 interior 函数。 var = 0 def exterior(): var = 1 def interior(): print(var) return interior() # 这里返回 interior 函数调用结果 exterior() # 打印 1   从上面代码和结果中可以看到,interior 打印的 var 值 并非 第一行的 var。这说明,exterior 中的嵌套变量 var 覆盖了全局变量var=0,然后 interior 中的本地变量按照引用规则,就引用了var = 1。   接下来,我们仔细想想下面这句话:   interior 作用域在函数结束后就立即失效,而exterior嵌套作用域在 interior 的函数返回后却仍然有效。 var = 0 def exterior(): var = 1 def interior(): print(var) return interior # 这里返回 interior 函数对象 inter = exterior() inter() # 打印 1   看完上面代码,再思考一下刚刚的话。如果还不清楚,看下图:   图解   创建一个闭包必须满足以下几点:必须有一个内嵌函数内嵌函数必须引用外部函数中的变量外部函数的返回值必须是内嵌函数转   现在有了闭包的知识点,我们再聊聊装饰器(decorator)。我要掰开了揉碎了来说说装饰器。   刚刚接触装饰器的同学会对这个概念感到迷茫,然后你在网上(尤其 csdn)找例子或者教程,基本千篇一律,或者讲解的"点到为止",你在看完之后,或许更迷茫了。   函数是什么   在说装饰器前,我们聊聊 Python 的函数。众所周知:在 Python 中,一切皆对象,函数是一等对象。   编程语言理论家把"一等对象"定义为满足下述条件的程序实体:在运行时创建①能赋值给变量或者数据结构中的元素②能作为参数传递给函数③能作为函数的返回结果④   我们看这么一段程序:def double(x: int) -> int: return x * 2   这段代码很简单,计算了一个整数的2倍。那么我么用 dis 模块进行反编译,看看他是怎么运行的。>>>from my_test import double >>>from dis import dis >>>dis(double) # 结果如下   源码行号   指令在函数中的偏移   指令符号   指令参数   实际参数值   2


  0
  LOAD_FAST   0
  x   2
  LOAD_CONST   1
  2
  4
  BINARY_MULTIRLY   6
  RETURN_VALUE   指令符号解释:LOAD_FAST :一般加载局部变量的值,也就是读取值,用于计算或者函数调用传参等; LOAD_CONST :加载 const 变量,比如数值、字符串等等; BINARY_MULTIRLY:见名知意,二进制乘法RETURN_VALUE:返回值   结合反编译的结果,仔细理解一下代码的运行流程。下面我们看另外一个例子:def double(x: int) -> int: return x * 2 def triple(x: int) -> int: return x * 3 def call_func(func, x: int) -> int: return func(x) result = call_func(triple, 2) print(result)dis(call_func)   源码行号   指令在函数中的偏移   指令符号   指令参数   实际参数值   10
  0
  LOAD_FAST   0
  func   2
  LOAD_FAST   1
  x   4
  CALL_FUNCTION   1
  6
  RETURN_VALUE   在运行过程中:出现了 CALL_FUNCTION 。结合第13行代码,仔细体会一下这句话:函数能作为参数传递给另外一个函数。   我们现在看一下闭包的执行流程def call_func(): def double(x: int) -> int: return x * 2 return double   dis(call_func)   里边出现了一个关键词:MAKE_FUNCTION,见名知意,创建函数。此时再回想"一等对象"所满足的条件。   说了这么多,无非是想告诉大家一个重要的东西,函数就是对象,可以被另一个函数返回,可以被赋值,也可以被调用。   其实到这里,才真是说完闭包这个东西。装饰器和闭包大同小异,下面我们接着来。   装饰器   有这种一种等价语法:def callfunc(func): return 1 @callfunc def triple(x: int) -> int: return x * 3   等价于def callfunc(func): return 1 def triple(x: int) -> int: return x * 3 triple = callfunc(triple)   无论上面那种方式,我们输出的 tripre 这个对象的值都是 1>>> print(triple) >>> 1   所以,闭包可以写成@这种形式呢?其实,装饰器可以理解为闭包的一种,我们可以这样认为:闭包传递的是变量,而装饰器传递的是函数,除此之外没有任何区别。   我们看一个打印时间的装饰器:import time def timeit(func): def wrapper(x): start = time.time() ret = func(x) print(time.time() - start) return ret return wrapper @timeit def my_func(x): time.sleep(x) my_func(1)   timeit 装饰器就打印 my_func 函数的运行时间。是不是在了解完闭包之后很简单了。   装饰器的作用就是:在不改变原函数的情况下,对已有函数进行额外的功能扩展。   恭喜你,Python 技能又进一步。   回到 Flask 我们看看路由装饰器   Flask 中路由的装饰器很简单,我们以 route 为例,以下是 route 函数源码(抽离版):import typing as t def add_url_rule(rule, endpoint, f, param): pass def route(rule: str, **options: t.Any) -> t.Callable: def decorator(f: t.Callable) -> t.Callable: endpoint = options.pop("endpoint", None) add_url_rule(rule, endpoint, f, **options) return f return decorator   route 函数就是一个装饰器,内部嗲用 add_url_rule 实现真正的路由添加。再回过头看看装饰器的作用和定义以及使用,是不是明白了许多!加油,慢就快,快就是慢。合   我整理了自学 Python 的视频,涉及到 爬虫、Web、数据分析、机器学习和深度学习等内容,留言转发并后台发送:"你好,Python",就可以免费获取啦!   爬虫   我也是从大学一路自学走来的,深知自学的情况下,没有项目是多么的难受。现在免费赠送python项目实战,后台私聊即可获得。   最后,动动手点个赞,您的支持是我创作的最大动力[比心]

云南安宁后山崀村从发展乡村到经营乡村彩色水稻(供图)丰收节(供图)金色螳川牧羊湖(供图)牧羊村壁画(供图)唤醒沉睡乡村资源,以村为基本单元,激活基层社会治理细胞,近年来,云南安宁市温泉街道后山崀村委会通过三个转变,把新疆博斯腾湖再现精灵鹅喉羚悠闲觅食精灵般的鹅喉羚频繁出现。胡侍琦摄中新网乌鲁木齐12月9日电(年磊胡侍琦)12月9日,在新疆博湖县境内博斯腾湖南岸的戈壁滩上,精灵般的鹅喉羚频繁出现,它们时而驻足远眺,时而结队而行,(新时代新征程新伟业)红旗渠畔庙荒村的乡村振兴之变河南安阳林州市庙荒村位于太行山下红旗渠畔。曾经的庙荒村地薄路差房屋旧,近年来,庙荒村在积极改善农村基础设施的同时,充分利用一山(太行山)一水(红旗渠)资源,大力发展乡村旅游产业。如贵阳一地入选全国乡村旅游重点镇贵阳网甲秀新闻讯日前,记者从开阳县文旅局获悉,该县禾丰乡成功入选第二批全国乡村旅游重点镇(乡),禾丰乡的成功入选,将有效推动该乡旅游产业发展,助力乡村振兴。据了解,文化和旅游部日前乡村爱情扮演者王小蒙今天直播突然宣布一件大事,自己又要结婚1拖2准备嫁给一位富商,爱情来了真的挡也挡不住,听说这位富商是在东南亚做生意的,都是做一些房地产实体行业,之前因为疫情的原因没有回国,现在终于可以回来紧急的把婚事给办了。这位大哥很最新!卫健委不建议2岁内孩子看手机眼科专家不要一刀切前不久,国家卫健委发布了3岁以下婴幼儿健康养育照护指南(试行)。只是这里面有1个专家建议,直接刺激到了广大宝妈们的神经。特别是对于疫情正在居家办公,还和孩子们关在一起的宝妈!专家建吴哥之前的柬埔寨图片来源于网络文蒋冉Jiang编辑蒋冉Jiang吴哥古城对大多数人来说,吴哥古城就是Cambodia的同义词,但吴哥帝国的历史只能追溯到公元802年。当时国王迦耶跋摩二世(Jaya元宇宙直播展现顺义冰雪魅力新华网北京12月9日电第八届北京顺义冰雪温泉欢乐季的推介会9日在元宇宙冰雪小镇举行。这座小镇是运用5G网络3D全景展示VR虚拟现实等技术,打造的一个沉浸式虚拟场景,带领观众在元宇宙美在身边晋在眼前丨最能看出晋商胸怀,值得去一万次的地方在山西最适合来一场深度文化游也许你已经看过山西的一些大院但这所大院的包容性之大一定可以既饱你眼福又滋养心灵山西运城李家大院坐落在山西省万荣县的闫景村创建于清道光年间现存的古院子11喜报黄河口最美观鸟季,一起来邂逅鸟类天堂获山东省优质旅游产品12月7日,山东省文化和旅游厅发布关于公布2022年全省优秀旅游产品好客山东游品荟创新营销推广活动文旅网络营销优秀案例评选结果的通知(以下简称通知)。通知明确,经各市组织发动和专家开城通知!来太原古县城邂逅美好,开启冬季的浪漫时光居家多天也是时候出来透透气了太原古县城已全面消杀为您提供安全舒适的游玩环境来这里邂逅冬季的美好十字街上的袅袅炊烟,飘散出来的食物香气,店铺里传来老板们热情的吆喝声,带你重返喧闹人世
DNF8。11黑马材料!商人已经开始行动,金绿柱石价格涨了8。11机械战神实验室重磅降临,比寂静城更高的副本,产出高词条史诗装备。也正因为如此,黑马材料诞生,黑商已经行动起来,各个大区拍卖行上,价格开始上涨!8月黑马材料在110级版本,金关系数据库是如何工作的数组,树和哈希表现在我们已经明白了时间复杂度和排序的思想,接下来我要告诉你三个数据结构。这些数据结构都很重要,因为它们是现代数据库的骨架。我也会引入数据库索引这一概念。数组二维数组微软Xbox宣布我的世界Minecraft游戏中将重建古城堡IT之家8月1日消息,微软官方宣布,Xbox与NationalTrust合作在我的世界Minecraft中重建科夫城堡。微软称,为了庆祝Minecraft的TheWildUpdat卖掉房子做出94好评的游戏后,他们改编了一部火遍全网的国产高分剧您看我还有机会吗?文严锦彦2020年,国产悬疑剧隐秘的角落爆火。凭借逻辑严密和细思极恐的悬疑故事,剧集播出至今仍在豆瓣保持着8。8分评价。剧中的您看我还有机会吗一起去爬山等名场面,曝光华为Mate50系列渲染图,华为Mate40价比百元机刷新低价纪录从曝光的华为Mate50系列渲染图看到,这三款机型的设计元素类似。都是以环形镜框为主,其中只有标准版配备了三镜头,而Pro和保时捷版都是采用四颗镜头的模块。值得一提的是,由于华为M职场入门耳机怎么选,教你挑好不挑贵职场入门耳机怎么选,教你挑好不挑贵在职场里,一副好的耳机是非常有必要的投入。无论是工作语音亦或者是休息休闲,耳机总能给你最舒适的陪伴。不过想要佩戴的舒适长久,那在耳机的选择上可得下国乒坏消息,刘国正辞职赴清华大学任教,球迷们含泪不舍国乒坏消息,刘国正辞职赴清华大学任教,球迷们含泪不舍。早在年初,媒体报道上我们时不时可以听到刘正国和王皓教练辞职的消息,那时候王皓还出面解释说是没有此事,可是刘国正教练一直保持沉默国产手机冲击高端失败,iPhone13创造历史记录,谁该为溃败负责?今年国产手机过的一点也不好,因为国产手机的糟糕表现,直接让苹果创造了十二年来,第二季度份额最好的一次销售记录。那些前两年信誓旦旦说冲击高端市场,对标苹果iPhone要把苹果iPho夏日购机首选vivoXNote超大屏幕,超多乐趣炎炎夏日来袭,很多人选择在室内进行娱乐活动,一台大屏手机就成为佳选,因为不仅可以用它来打游戏,并且还能拿来追剧,一举多得。vivoXNote的娱乐性就很强,它搭载高性能芯片,并且有DoctorCurious41天体物理理解的进步中国科学院理论物理研究所导言纵观三千年来天文学的思想和发现,我们就知道单凭高明的猜想是不够的。实质进步主要来自于引入新的观测工具和理论工具。作者简介Profile作者马丁哈维特(MartinHarwit)什么是核聚变?中国人造太阳领先世界,无限能源或将成为现实?太阳已经燃烧了数亿年的时间,期间释放的能量孕育了地球上的万事万物。太阳之所以能对外释放出大量的能量,这其实主要得益于其内部一直在进行着的核聚变反应,从诞生的那一刻起,太阳内部的核聚