免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1947 | 回复: 2
打印 上一主题 下一主题

求教python中的decorator [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-06 17:27 |只看该作者 |倒序浏览
如题,不太理解decorator,一般用在什么地方?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2011-04-07 09:05 |只看该作者
本帖最后由 OwnWaterloo 于 2011-04-07 09:06 编辑

有一些函数可以接受函数为参数, 并返回新的函数。

比如 staticmethod。

  1. def X :
  2.    def f(*rest) : print rest
  3.    def g(*rest) : print rest
  4.    g = staticmethod(g)
复制代码
x = X() # <__main__.X instance at ...>
x.f() # (<__main__.X instance at ...>, )
x.f(12) # (<__main__.X instance at ...>,  12)

没有经过staticmethod修饰的函数f, 会将 instance 作为一个隐式参数传递, 作为 f 的第1个参数。

x.g() # ()
x.g(12) # (12,)

而经过 staticmethod 修饰的函数g, 就不会传入这个隐式参数。



考虑这样一种情况:

  1. class Y :
  2.   def f(*rest) :
  3.       # very long
  4.   f = staticmethod(f)
复制代码
大致有这样一些弊端:
1. f的名字被重复了3次, 违反DRY
2. 如果f的定义很长, 容易漏掉 "f被修饰过" 的信息

而 decorator 的语法:

  1. class Y :
  2.   @staticmethod
  3.   def f(*rest) :
  4.       # very long
复制代码
就可以避免上那些问题。

论坛徽章:
0
3 [报告]
发表于 2011-04-08 00:32 |只看该作者
回复 2# OwnWaterloo

thanks a lot!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP