python 装饰器的使用

Posted 流星小子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 装饰器的使用相关的知识,希望对你有一定的参考价值。

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

概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能

第一版装饰器的写法:

1 def debug(func):
2     def wrapper():
3         print("[DEBUG]:enter {}()".format(func.__name__))
4         return func()
5     return wrapper
6 def say_hello():
7     print("hello!")
8 
9 say_hello = debug(say_hello)

第二版装饰器的写法:

 decorator 

def debug(func):
    def wrapper():
        print "[DEBUG]: enter {}()".format(func.__name__)
        return func()
    return wrapper

@debug
def say_hello():
    print "hello!"

  

因为函数有千千万,你只管你自己的函数,别人的函数参数是什么样子,鬼知道?
还好Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。

def debug(func):
    def wrapper(*args, **kwargs):  # 指定宇宙无敌参数
        print "[DEBUG]: enter {}()".format(func.__name__)
        print Prepare and say...,
        return func(*args, **kwargs)
    return wrapper  # 返回

@debug
def say(something):
    print "hello {}!".format(something)

 

带参数的装饰器

假设我们前文的装饰器需要完成的功能不仅仅是能在进入某个函数后打出log信息,而且还需指定log的级别,那么装饰器就会是这样的。

def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print "[{level}]: enter function {func}()".format(
                level=level,
                func=func.__name__)
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper

@logging(level=INFO)
def say(something):
    print "say {}!".format(something)

# 如果没有使用@语法,等同于
# say = logging(level=‘INFO‘)(say)

@logging(level=DEBUG)
def do(something):
    print "do {}...".format(something)

if __name__ == __main__:
    say(hello)
    do("my work")

 


以上是关于python 装饰器的使用的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器的使用

python 函数 装饰器的使用方法

python使用上下文对代码片段进行计时,非装饰器

Python装饰器的实现和万能装饰器

转发对python装饰器的理解

python 多个装饰器的调用顺序