论坛首页 综合技术论坛

Python decorator

浏览 4913 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-08  
function decorator:
语法:
@decoratorname
def decoratoredfunction

例如:

python 代码
 
  1. class C:  
  2.     @classmethod  
  3.     def meth(cls):  
  4.         ...  


上面的 @classmethod 等于 meth=classmethod(meth)

decorator 能够用于为函数(普通函数或类的成员函数)添加功能, 不能够用来为类动态添加方法.
decorator 把被修饰的函数作为参数, 其返回值通常是一个函数或者类

技术上讲, 任何只带一个参数能够被调用的对象都可以被当作decorator使用, 但是这个定义过于宽泛而无用, 所以可以把decorator分为以下两类:
  • signature-preserving decorator: 例如, 一个输入为一个函数输出与该函数的输出一致的可调用对象
  • signature-changing decorator: 例如, 内部类 staticmethod 和 classmethod 就属于这种类型, 因为它们会把被修饰的函数作为输入, 返回一个描述对象, 这个对象不是函数, 不可调用
Decorator的用法:
  • @catch_on((exception list), functor)
其定义如下:
python 代码
 
  1. from types import *  
  2.   
  3. def catch_on(excepts, act):  
  4.   def call(proc, *args, **kw):  
  5.     try:  
  6.       return proc(*args, **kw)  
  7.     except excepts, e:  
  8.       if not act and type(act) is types.FunctionType:   
  9.         act(e)  
  10.       pass  
  11.     except Exception, e:  
  12.       if not isinstance(e, excepts):  
  13.         raise  
  14.         
  15.   return decorator(call)  
  16.   
  17. def x():  
  18.   raise NameError, "NameError"  
  19.     
  20. def boo():  
  21.   raise KeyError, "KeyError"  
  22.   
  23. def bar():  
  24.   raise ValueError, "ValueError"  
  25.     
  26. @catch_on((KeyErrorValueError), lambda e: None)  
  27. def koo():  
  28.     x()  
  29.     boo()  
  30.     bar()  
  31.       
  32. @catch_on((KeyErrorValueError), lambda e: None)  
  33. def goo():  
  34.     boo()  
  35.     bar()  
  36.     x()  
  37.   
  38. koo()  
  39. goo() 

  • 代码块
   发表时间:2007-04-08  
1 发错版了
2 要说decorator,  limodou这篇讲的很不错 .
http://blog.donews.com/limodou/archive/2004/12/19/207521.aspx

3 加到python圈子里吧.
0 请登录后投票
   发表时间:2007-04-09  
1\ 我发帖的时候没有找到python的论坛,只好随意选了一个
2\ 这只是我学习python decorator的笔记, 心得
3\ 怎样加入圈子?
0 请登录后投票
   发表时间:2007-04-10  
hfeeqi 写道
1\ 我发帖的时候没有找到python的论坛,只好随意选了一个
2\ 这只是我学习python decorator的笔记, 心得
3\ 怎样加入圈子?
到这边,加入就行了.
http://onlypython.group.iteye.com/
0 请登录后投票
   发表时间:2007-05-23  
python3000中将加入 class decorator
@decorator
class Klass(object):pass

等价于
Klass = decorator(Klass)
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics