关于 python 装饰器的理解请教一下大家

2016-02-25 09:58:54 +08:00
 linkbg

python 的装饰器,我查了相关的资料,意思就是一个函数可以传入另一个函数中。
那么我可不可以不是特别规范的理解为这是一种函数中的继承呢?或者是类似继承的形式在函数中的实现呢?谢谢

3786 次点击
所在节点    Python
32 条回复
Allianzcortex
2016-02-25 13:04:10 +08:00
语法糖

最好的理解就是在 django 和 Flask 里都有一个  @login_required,如果有任何需要登陆后才能操作的函数,在前面加上一个 @login_required()
shyling
2016-02-25 13:08:15 +08:00
对了...decorator 不是闭包.你能在 decorator 装饰的函数里访问 decorator 里的局部变量?
youkochan
2016-02-25 13:18:19 +08:00
应该叫复合函数?
MrEggNoodle
2016-02-25 13:20:48 +08:00
找一本叫作《 python 学习手册》的书,我的答案就在里面找到的。我想你的答案也在里面。
julyclyde
2016-02-25 13:24:31 +08:00
@limbo0 装饰器那一层可以不包含被内部函数引用的变量,所以也可以不形成闭包
julyclyde
2016-02-25 13:25:08 +08:00
@limbo0 你首先应该区分“可以做”和“必须做”以及“做了之后的附带效应”这三个概念
limbo0
2016-02-25 13:58:52 +08:00
@julyclyde 刚看了下确实是我弄混了, 一般用的时候都是有参数用的, 那为什么说'实现闭包需要用装饰器'
shuax
2016-02-25 14:03:48 +08:00
@jixiangqd 难道不等价?我的 python 白学了。
incompatible
2016-02-25 14:09:47 +08:00
搞 Java 的进来说一声:
这不是语法糖,跟设计模式里的 Decorator 也没什么关系。
这玩意儿就是用来实现 AOP 的。 21 楼的 @Allianzcortex 已经把它的用法说的很明白了。
feather12315
2016-02-25 15:40:29 +08:00
同意 17 楼答案,花式闭包。
前几天刚好写过相关
[闭包与装饰器]( https://vvl.me/style/2016/02/17/python%E4%B9%8B%E9%97%AD%E5%8C%85%E4%B8%8E%E8%A3%85%E9%A5%B0%E5%99%A8.html)

装饰器是用来装饰函数的;它返回的是一个函数对象;被装饰函数的标识符指向返回函数的对象;语法糖 @deco


若是还不明白的话,参考资料里面有慕课网的超链接。
startover
2016-02-25 21:53:40 +08:00
如果一个函数被调用时需要增加一些功能,要么重写这个函数,要么利用高阶函数传入这个函数然后在高阶函数内部改造最后返回一个新的函数。后一种方法,即装饰器。

归根结底,装饰器就是利用了高阶函数和闭包的特性实现的语法糖,个人认为不用执着于概念,知道其应用场景就好了。

可以参考我之前写的一篇文章: http://startover.github.io/articles/2015/04/27/python-decorator-mistake/
wdg8106
2016-03-02 14:39:54 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/258967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX