python装饰器,它的功能大致上和java当中有代理实现的拦截器前后执行一段代码,可以做日志记录,权限控制,缓存等功能。
Pthon装饰器主要有两类函数式装饰器, 类装饰器。再往细分主要有如下几种:
下面就上面几种装饰器做下说明:
1.第一种:
def wrapper(func): def inner(): print 'call from func %s()' % (func.func_name) return func() return inner @wrapper def test(): print 'haha'
2.第二种:
def wrapper(func): def inner(inner_arg): print 'call from func %s(), args: %s' % (func.func_name, inner_arg) return func(inner_arg) return inner @wrapper def test(arg): print 'haha'
3.第三种:
def wrapper(log = True): def inner(func): def in_inner(): if log: print 'log...' return func() return in_inner return inner @wrapper(log = True) def test(): print 'haha'
4.第四种:
def wrapper(log = True): def inner(func): def in_inner(*args): if log: print 'log...' return func(args) return in_inner return inner @wrapper(log = True) def test(arg): print 'haha'
5.第五种:
def wrapper(cls): def inner(): print 'call from cls.' return cls() return inner @wrapper class Dectorated(object): def __init__(self): print 'init the cls' def __call__(self, *args, **kwargs): print 'please call me.' 当进行对象初始化或者进行对象调用的时候 Dectorated()()会调用装饰器。
6.第六种:
def wrapper(cls): def inner(*args): print 'call from cls.' return cls(args) return inner @wrapper class Dectorated(object): def __init__(self, attr): self.attr = attr print 'init the cls' def __call__(self, *args, **kwargs): print 'please call me.'
7.第七种:
def wrapper(log=True): def inner(cls): def in_inner(): if log: print 'log for decorator.' return cls() return in_inner return inner @wrapper(log=True) class Dectorated(object): def __init__(self): print 'init the cls'
8.第八种:
def wrapper(log=True): def inner(cls): def in_inner(*args): if log: print 'log for decorator.' return cls(args) return in_inner return inner @wrapper(log=True) class Dectorated(object): def __init__(self, attr): print 'init the cls' self.attr = attr
9.第九种:
class Wrapper(object): def __init__(self, wrapper_func): self.func = wrapper_func def __call__(self): return self.func() @Wrapper def test(): print 'hello world'
10.第十种:
class Wrapper(object): def __init__(self, wrapper_func): self.func = wrapper_func def __call__(self, *args, **kwargs): return self.func(args) @Wrapper def test(arg): print 'hello world'
11.第十一种:
class Wrapper(object): def __init__(self, init_msg = 'hello'): self.init_msg = init_msg def __call__(self, func): def _call(): print self.init_msg return func() return _call @Wrapper(init_msg= 'world') def test(): print 'hello world'
12.第十二种:
class Wrapper(object): def __init__(self, init_msg = 'hello'): self.init_msg = init_msg def __call__(self, func): def _call(*args, **kwargs): print self.init_msg return func(args) return _call @Wrapper(init_msg= 'world') def test(arg): print 'hello world'
13.第十三种:
class Wrapper(object): def __init__(self, cls): self._cls = cls def __call__(self): return self._cls() @Wrapper class Wrappered(object): def __init__(self): print 'be wrappered!'
14.第十四种:
class Wrapper(object): def __init__(self, cls): self._cls = cls def __call__(self, *args, **kwargs): return self._cls(args) @Wrapper class Wrappered(object): def __init__(self, init_value): print 'be wrappered!' self.init_value = init_value
15.第十五种:
class Wrapper(object): def __init__(self, init_msg): self.init_msg = init_msg def __call__(self,cls): def _call(): print self.init_msg return cls() return _call @Wrapper('Hello') class Wrappered(object): def __init__(self): print 'be wrappered!'
16.第十六种:
class Wrapper(object): def __init__(self, init_msg): self.init_msg = init_msg def __call__(self,cls): def _call(*args, **kwargs): print self.init_msg return cls(args) return _call @Wrapper('Hello') class Wrappered(object): def __init__(self, init_value): print 'be wrappered!' self.init_value = init_value