求教python中的decorator
时间:2011-04-06
来源:互联网
如题,不太理解decorator,一般用在什么地方?
作者: 吴秦 发布时间: 2011-04-06
本帖最后由 OwnWaterloo 于 2011-04-07 09:06 编辑
有一些函数可以接受函数为参数, 并返回新的函数。
比如 staticmethod。
复制代码
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. f的名字被重复了3次, 违反DRY
2. 如果f的定义很长, 容易漏掉 "f被修饰过" 的信息
而 decorator 的语法:
复制代码
就可以避免上那些问题。
有一些函数可以接受函数为参数, 并返回新的函数。
比如 staticmethod。
- def X :
- def f(*rest) : print rest
- def g(*rest) : print rest
- g = staticmethod(g)
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, 就不会传入这个隐式参数。
考虑这样一种情况:
- class Y :
- def f(*rest) :
- # very long
- f = staticmethod(f)
1. f的名字被重复了3次, 违反DRY
2. 如果f的定义很长, 容易漏掉 "f被修饰过" 的信息
而 decorator 的语法:
- class Y :
- @staticmethod
- def f(*rest) :
- # very long
作者: OwnWaterloo 发布时间: 2011-04-07
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28