python的装饰器的简单案例

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

简单装饰器:

# coding=utf-8

def fun(func):
    def wrapper(*args, **kwargs):
        print 'name-->%s' % func.__name__
        return func(*args, **kwargs)

    return wrapper


@fun
def boo():
    print 'i is boo!'


boo()

具体处理函数的情况如下

# coding=utf-8

def fun(func):
    @wraps(func)     #保证原函数的信息不变
    def wrapper(*args, **kwargs):
        print 'name-->%s' % func.__name__
        t = func(*args, **kwargs)
        print t
        return t

    return wrapper


@fun
def boo(a, b):
    print 'i is boo!'
    return a + b


boo(10, 11)

带参数的装饰器:

# coding=utf-8

def fun(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print 'name-->%s' % func.__name__
            t = func(*args, **kwargs)
            print t, level
            return t

        return wrapper

    return decorator


@fun(level=5)
def boo(a, b):
    print 'i is boo!'
    return a + b


boo(10, 11)

类装饰器
再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。

class Demo(object):
    def __init__(self, func):
        self._func = func
        pass

    def __call__(self, *args, **kwargs):
        print '-----------'
        t = self._func(*args, **kwargs)
        print t
        return t


@Demo
def boo(a, b):
    print 'i is boo!'
    return a + b


boo(10, 11)

内置装饰器
@staticmathod、@classmethod、@property
装饰器的顺序
@a
@b
@c
def f ():
等效于

f = a(b(c(f)))

猜你喜欢

转载自blog.csdn.net/u010154424/article/details/52185785