SlipStupig
V2EX  ›  Python

想请教一下 python 装饰器的作用

By SlipStupig at 2016 年 8 月 8 日 · 5638 次点击
之前理解 python 装饰器等于是在函数执行前先执行装饰器函数,但是直接写一个函数调用或者写回调函数比有什么区别呢?
第 1 条附言  ·  2016 年 8 月 11 日
感谢各位回答,我总结了一下大家的意见
1.减少函数嵌入
2.函数前置拦截
3.提高代码可读性
22 条回复  •  2016-08-09 14:07:52 +08:00
Cabana
   1
Cabana  
   2016 年 8 月 8 日 via Android
能写在一行里(逃…
greenlet
   2
greenlet  
   2016 年 8 月 8 日
功能上没区别,看上去更自然。
lixm
   3
lixm  
   2016 年 8 月 8 日
AOP
justou
   4
justou  
   2016 年 8 月 8 日
装饰器模式的好处
mgna17
   5
mgna17  
   2016 年 8 月 8 日 via Android
先后顺序的差别吧,装饰器总是比被装饰函数先执行,它可以决定如何使用被装饰函数。
wizardforcel
   6
wizardforcel  
   2016 年 8 月 8 日
是在函数定义后以函数作为参数执行装饰器函数,返回值还绑定到原来的名字上。
justou
   7
justou  
   2016 年 8 月 8 日   ❤️ 1
我在实际当中使用过的一个情形:
有一大批函数都需要做相同或相似的参数检查, 每个函数里面都检查会造成大量重复代码, 那么就把检查部分提出来放到一个检查函数, 而这个检查函数返回的是经过参数检查的一系列函数, 也就是函数返回函数, python 里自然就是装饰器了, 只需要在那一系列函数上方套一个 @check_func, 调用这一系列函数就自动完成参数检查了: 避免了重复代码, 避免了到处都要手动调用一个检查函数
am241
   8
am241  
   2016 年 8 月 8 日 via Android
为了思路清晰
lichun
   9
lichun  
   2016 年 8 月 8 日
完全可以把 "@" 当做语法糖,也可以直接使⽤用函数式写法。只不过那样不便于代码维护
xrlin
   10
xrlin  
   2016 年 8 月 8 日
方便进行维护,而且程序更清晰,很方便给其他函数添加额外的功能。
murmur
   11
murmur  
   2016 年 8 月 8 日
如果能用装饰器上的功能 需要的时候 去掉装饰器一样很容易
Yinz
   12
Yinz  
   2016 年 8 月 8 日
『装饰器等于是在函数执行前先执行装饰器函数』这句话其实有点问题。
想象这样一个情形,一个外部 python 文件(a.py)中,包含了一个被装饰器(dec)修饰的函数(some_func)。当你在其他文件(b.py)中 import a ,装饰器函数(dec)就被执行了。而不是你调用 some_func 时才执行 dec 。你可以试一下在 dec 中写一句 print ,然后就可以看到 import a 的时候就被 print 出来了。
julyclyde
   13
julyclyde  
   2016 年 8 月 8 日
不是执行函数前先执行装饰器
而是在声明函数时先执行装饰器,然后用装饰器输出的那个函数体代替原来准备声明的那个函数体
incompatible
   14
incompatible  
   2016 年 8 月 8 日 via Android
关键词: AOP
通常用来实现:记录业务日志、做参数统一检验、做事务管理
tongjie
   15
tongjie  
   2016 年 8 月 8 日
def safe_run(_logger):
def _run_once(func):
def f(*args,**kwargs):
try:
return func(*args,**kwargs)
except:
_logger.error(traceback.format_exc())
return f
return _run_once

在要执行的方法前面加上这个装饰器,放心多了;
BOYPT
   16
BOYPT  
   2016 年 8 月 8 日
你们说那么多,还不如看看 flask 或者 bottle 框架是怎么用的,瞬间明白装饰器的好处了。
will0404
   17
will0404  
   2016 年 8 月 8 日 via iPhone
只是好看一点罢了 和写在函数里调用返回个函数没什么区别 类似蛋疼的 feature 还有 js 里的 promise 大张旗鼓的被实现出来实际呢只是让嵌套回调好看一点 个人灼见
SayHaHa
   18
SayHaHa  
   2016 年 8 月 9 日
语法糖,复用方便
hosiet
   19
hosiet  
   2016 年 8 月 9 日 via Android
14 楼的用法基本就是九成的使用场景,只要写一次装饰器就可以到处使用,概念清晰易理解,何乐而不为呢
xiaket
   20
xiaket  
   2016 年 8 月 9 日
readability counts.
ziXiong
   21
ziXiong  
   2016 年 8 月 9 日
代码重用,也可以完全改变被装饰函数的行为。很灵活的。
zhujq
   22
zhujq  
   2016 年 8 月 9 日
用上比不用上更能装逼
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 57ms · 3.9.8.5