python 装饰器类别


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

猜你喜欢

转载自study-a-j8.iteye.com/blog/2358961