竹子开花的时 发表于 2017-4-21 08:32:30

Python decorator

function decorator:
语法:
@decoratorname
def decoratoredfunction

例如:

python 代码
 

[*]class C:  
[*]    @classmethod  
[*]    def meth(cls):  
[*]        ...  



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

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

技术上讲, 任何只带一个参数能够被调用的对象都可以被当作decorator使用, 但是这个定义过于宽泛而无用, 所以可以把decorator分为以下两类:

[*]signature-preserving decorator:例如, 一个输入为一个函数输出与该函数的输出一致的可调用对象
[*]signature-changing decorator: 例如, 内部类 staticmethod 和 classmethod 就属于这种类型, 因为它们会把被修饰的函数作为输入, 返回一个描述对象, 这个对象不是函数, 不可调用
Decorator的用法:

[*]@catch_on((exception list),functor)
其定义如下:
python 代码
 

[*]from types import *  
[*]  
[*]def catch_on(excepts, act):  
[*]  def call(proc, *args, **kw):  
[*]    try:  
[*]      return proc(*args, **kw)  
[*]    except excepts, e:  
[*]      if not act and type(act) is types.FunctionType:   
[*]        act(e)  
[*]      pass  
[*]    except Exception, e:  
[*]      if not isinstance(e, excepts):  
[*]        raise  
[*]        
[*]  return decorator(call)  
[*]  
[*]def x():  
[*]  raise NameError, "NameError"  
[*]    
[*]def boo():  
[*]  raise KeyError, "KeyError"  
[*]  
[*]def bar():  
[*]  raise ValueError, "ValueError"  
[*]    
[*]@catch_on((KeyError, ValueError), lambda e: None)  
[*]def koo():  
[*]    x()  
[*]    boo()  
[*]    bar()  
[*]      
[*]@catch_on((KeyError, ValueError), lambda e: None)  
[*]def goo():  
[*]    boo()  
[*]    bar()  
[*]    x()  
[*]  
[*]koo()  
[*]goo() 



[*]代码块
页: [1]
查看完整版本: Python decorator