【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!

作者: 码农高天分类: 计算机技术 发布时间: 2022-03-08 13:22:04 浏览:115963 次

【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!

嘿嘿逻辑:
装饰器只要记住一句话就行了,在运行函数前,会先运行这个函数前的装饰器。装饰器一般用于代码重复量较大的时候,就比如系统登陆的校验,在装饰器中检验一下token值,以后呢代码就可以直接调用。 不过我好奇,up写的是一个方法装饰器,并不是类装饰器,我想知道类装饰器该怎么写?虽然django提供了一个可以将方法装饰器转换为类装饰器,但每次使用都要调用,很麻烦,希望有大佬解答一下[抱拳][抱拳][抱拳][抱拳]

【回复】对类显式定义 __call__,让对象处于一个 callable状态就行了
BlockUp:
装饰器搞懂了,up 下期能不能详解一下 async 和 await 是怎么回事。

【回复】异步协程可太复杂了。难得不是协程本身,而是异步设计思想
北堂盟:
说实话,这种基础但是有一定难度的知识应该完播率和三连更多,毕竟不是人人都能听懂看懂源码,up要数据好看可以多做这种,然后间隔穿插源码和真实战[冰墩墩]

【回复】是的 那种什么一小时入门python 然后就是列表表达式的已经吐了 但是推出来全是这种低端入门的
【回复】回复 @霍华德_小恶魔 :竟然在这看到霍叔了
两颗熟李子:
看完已经有想把之前写的烂代码重写一遍的冲动了[笑哭]

【回复】写代码之前一定要先整一个啥都不做的装饰器,给每个函数都先把帽子戴上。
怜星:
就前段时间也搜了好久装饰器用法和用例,基本的用法倒是搞明白了,现在新写的代码中也有在用上装饰器了。 就是有个问题一直没整明白,为啥饰器内部的函数对象wrapper已经被封装好返回去了,等再重新调用这个wrapper还是可以拿到原来传进来的装饰器参数呢。是因为就返回了一个内存地址,等执行函数的时候又回到了装饰器内部去执行了,还是解释器在底层做了些别的事情? 有没有大神能给我解惑

【回复】回复 @然然比 :原来这种东西叫闭包[思考],去网上搜了下大神写的解析搞明白七七八八了,打断点看了下确实在__clusure__里把传进来的参数保存进去了,每个参数都是一个cell类型的对象 在变量被引用时就将cell中的变量放入栈顶(最后这句这个是官方的解释,有点不懂)
【回复】这个叫闭包closure,在函数的__closure__属性里可以看到“原来传进去的内容” 举个简单的例子: x=2 def a(y): def b(z): return True+x+y+z return b c=a(3) c(4) 在那段加法中含有Python的4种变量,True是builtin,x是global,y是nonlocal,z是local。其中nonlocal变量会被专门存储一份,访问c.__closure__可以发现是一个tuple,里面有一个元素,元素里面的内容是3
伏龙港湾:
听得懂的不会不懂装饰器,不懂装饰器的听这个还是一头雾水。这个适合刚理解装饰器的人再深入了解一下。

【回复】这个和泛函Rize表示定理异曲同工,y=ax,修饰函数决定“a”,每个“a”对应一个函数,建立了“a”与函数“y=ax”之间的一一映射。修饰函数确定了‘a’之后,就确定了其对应的函数,然后用那个函数就行了。
【回复】应该再细化一下,这个在运行的过程中每一步都是什么结果
【回复】我都没接触过装饰器,有一点C语言基础,感觉讲的还挺好,比我自己去查资料要理解快些
黄金鞘翅的郡主:
下期讲生成器吧,还有闭包,一直没弄太懂[思考]

【回复】刚回复前面那个人,复制一份😂 闭包closure,举个简单的例子: x=2 def a(y): def b(z): return True+x+y+z return b c=a(3) c(4) 在那段加法中含有Python的4种变量,True是builtin,x是global,y是nonlocal,z是local。其中nonlocal变量会被专门存储一份,访问c.__closure__可以发现是一个tuple,里面有一个元素,元素里面的内容是3 最后一句执行的时候,那四个玩意的值都要找到,然后齐聚一堂加起来。y的值就是从闭包里找到的
【回复】不是,装饰器就是闭包啊.. 懂了装饰器怎么可能会不懂闭包
颃宝:
装饰器的个人笔记放在如下网页了,大家有需要的话可以看看哦:https://jingzhisheng.cn/brainiaccc/blog?id=1645683823956070400

【回复】大佬这个网页是怎么做的呀,有教程吗
【回复】回复 @寒泉散人 : 主题名字我好像忘了.......[大哭]
【回复】你的网站做的好优美啊,想问一下是主题的名字是什么[脱单doge][脱单doge]
danielsunck:
4:31, 应该写的清楚一点。比如 double = get_muliple_func(2), 然后print(double(3)) 其实是最后print( get_multiple_func(2)(3) ). 也就是说传入了n =2, x = 3. 我刚开始看怎么也看不明白。因为搞不清楚double 作为一个reference 怎么还能加参数。只到我自己写了一下。我才知道PYTHON的函数后边是可以跟两个括号的,第一个括号是本身第一层的参数,第二个是内嵌函数的参数。我相信这样写就很容易让一些刚刚接触装饰器的人明白了。否则看到这里后边就看不懂了。希望UP主可以做一下修改。

【回复】哇靠 看完有种恍然大悟的感觉!!!!!!!!!!!! 太感谢了
豪门百里:
最后的双层装饰器这样理解好一点:外层的timeit不是一个装饰器,只是一个生成装饰器的函数,里面的inner才是装饰器。timeit(10)就生成了inner这个装饰器,再装饰函数。外层timeit只有一个作用就是把参数传给wrapper,相当于装饰器的配置函数。

terry9876:
讲的不细,太快,完全不是掰开了揉碎了

Olaf小雪宝:
学了好多遍,始终弄不懂装饰器,听完up主的讲解,发现自己还是没明白,我太笨了[大哭][大哭][大哭]

【回复】回复 @curryzxycurry : 会的才能听懂,不会的还是不懂[喜极而泣]
【回复】回复 @齐乾语 : 可以看看CS61A 第三节课就是在讲的嵌套
falomsc:
感觉可以类比+=这种符号。两个变量a和b,a += b等价于a = a+b。而两个函数funa和funb,@funb换行def funa等价于funa = funb(funa)

【回复】up主问讲的好不好时我一直想回答不好,但说不清具体哪里不好。看了您的回答我就明白了,明明是两句话就能讲完的事情不应该讲的这么磨叽
吾沉醉于风中:
好家伙,我刷桌面装饰,刷到python这里来了[doge][doge][笑哭][笑哭][笑哭]

西西伯利亚寒流:
血书一个多进程吧 主要是spawn fork和forkserver的异同 他们继承的主进程的资源 python官方文档说的非常粗糙 底层代码能追溯到的也非常有限

西西伯利亚寒流:
一句话 语法糖 用dec对象对a装饰等价于a=dec(a) 就是将a作为参数传给dec 讲返回值回赋给a 这种看法下 用class装饰 用callable对象装饰就一通百通了

计算机 原创 科技 学习 python 编程开发

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!