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

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

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

3568 次点击
所在节点    Python
32 条回复
sudoz
2016-02-25 10:04:24 +08:00
显然不是继承,继承是可以重载父类的属性
而装饰器就是字面理解,在方法外面再包一层而无法对被包裹的方法进行改动
strahe
2016-02-25 10:06:08 +08:00
不能这么理解吧 不是一回事
SlipStupig
2016-02-25 10:07:40 +08:00
这个理解是不对的!就是在调用某个函数之前先调用装饰器函数, python 函数等于是个毛坯房装饰器等于一个毛坯房多了一盏灯,灯能干嘛不用我说了吧
ChiangDi
2016-02-25 10:13:07 +08:00
一个函数传到另一个函数那叫高阶函数啊
WangYanjie
2016-02-25 10:13:56 +08:00
我觉得不是这个样子的。

我觉得 Python 的装饰器本质上是一颗语法糖,
利用的是 Python 中函数可以作为参数传递的特点,
实现的是在执行函数时,做一些额外功能的任务。

@dec1
@dec2
def func():
pass



def func():
pass
func = dec1(dec2(func))

不是等价的嘛
jixiangqd
2016-02-25 10:30:11 +08:00
@WangYanjie 很明显不等价好么。。。不要在这误导。。。。

装饰器就是装饰器,可以参考 decorator pattern 的相关介绍。

装饰器和继承也不等价。不要钻牛角尖,非要把它理解多透彻,多用就知道怎么回事了。
xAx
2016-02-25 10:35:59 +08:00
不用 python 路过,只想说 GOF23 你肯定一点没看
julyclyde
2016-02-25 10:40:23 +08:00
不是继承,是同名替换,具体行为在装饰器里
chenxytw
2016-02-25 10:45:17 +08:00
bramblex
2016-02-25 10:47:18 +08:00
不过就是一个高阶函数在 python 里的语法糖而已 ╮(╯▽╰)╭

把一个函数包装成另一个函数的函数。
mulog
2016-02-25 10:48:55 +08:00
@jixiangqd 本来就是等价的啊
https://www.python.org/dev/peps/pep-0318/


Current Syntax
The current syntax for function decorators as implemented in Python 2.4a2 is:

@dec2
@dec1
def func(arg1, arg2, ...):
pass

This is equivalent to:

def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))

without the intermediate assignment to the variable func . The decorators are near the function declaration. The @ sign makes it clear that something new is going on here.
herozem
2016-02-25 10:49:52 +08:00
装饰器就是语法糖,

@bar
def foo():
pass

就相当与:

foo = bar(foo),

在这里 foo 就不是之前的 foo 了, foo 变成了 bar 里面返回的东西,如果返回函数,那 foo 还是函数,如果返回字符串,那 foo 就是字符串:

>>> def bar(func):
... return "hi"
...
>>> @bar
... def foo():
... pass
...
>>> foo
'hi'

https://github.com/jiajunhuang/blog/blob/master/python_descriptor_and_decorator.rst 我自己写的总结,不知道对你有没有帮助
jixiangqd
2016-02-25 11:12:36 +08:00
@chenxytw
@mulog
@WangYanjie

Sorry ,眼花看错了。。。恩,是等价的。。。
limbo0
2016-02-25 11:37:58 +08:00
需要了解两个概念 闭包和函数引用
julyclyde
2016-02-25 12:00:22 +08:00
@limbo0 你因果倒置了。实现闭包需要用装饰器,但装饰器本身很单纯
wellsc
2016-02-25 12:35:02 +08:00
花式闭包
hahastudio
2016-02-25 12:42:28 +08:00
s-m-n theorem
limbo0
2016-02-25 12:44:24 +08:00
@julyclyde 额, 是你弄错了吧? 闭包完全不依赖装饰器,
闭包 = 在函数里定义函数
python 装饰器 = 闭包 + 语法糖
lxy
2016-02-25 12:58:33 +08:00
其实就是用函数来封装函数。用惯之后特别爽,写个循环都能用上装饰器~
shyling
2016-02-25 13:04:07 +08:00
装饰器就是高阶函数的一个语法糖嘛=.=

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

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

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

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

© 2021 V2EX