装饰器Decorator

在前面的文章中知道一点,变量可以指向函数,所以变量也可以调用函数

其实装饰器的概念,就是在执行函数外面,再套一个修饰函数,用于检查某些项是否符合。

修饰符适用于以下场景:

  • 在用户执行某操作,操作函数一般会加上一个修饰符,来判断当前用户是否有资格执行【检查条件】
  • 代码中,对一个你不想改动的函数,记录函数的执行时间,可以用装饰器来搞定【记录日志】

下面来举个栗子看下装饰器的使用方法:

def log(func):
    def wrapper(*args, **kw):
        print('call %s():'% func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def exec_d():
    print("exec_d")

然后执行exec_d(),得到如下结果

call exec_d():
exec_d

注意观察下运行结果,第一行是call exec_d():,这行的打印是在log函数中执行的;第二行exec_d是在exec_d函数中打印的

介绍下装饰器的工作原理:

  • @log这一行代码,会被解释器翻译成log()
  • log()的括号内是放着后面行的调用函数,在这里即def exec_d():,所以最终解释成log(exec_d)

通过变量是可以执行函数的,所以log先执行,然后在执行exec_d函数

那如果是多个修饰符是怎么样的执行顺序呢?试一下看看....

def log1(func):
    def wrapper(*args, **kw):
        print('call %s():'% func.__name__)
        return func(*args, **kw)
    return wrapper

def log2(func):
    def wrapper(*args, **kw):
        print('call %s():'% func.__name__)
        return func(*args, **kw)
    return wrapper

@log1
@log2
def exec_d():
    print("exec_d")

exec_d()

运行结果:

call wrapper():
call exec_d():
exec_d

运行结果这里很不妙的出现了wrapper,因为多重装饰器的执行顺序是log1(log2(exec_d)),log2作为一个函数,返回的是wrapper函数,而不是exec_d函数,这是装饰器的一个坑

不过可以通过导入from functools import wraps,利用wraps返回func即可

多重装饰器

Python3教程--传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 装饰器(Decorator)是Python的一个重要部分。简单地说:它们是修改其它函数的功能的函数。 它们有助于让...
    hufengreborn阅读 717评论 0 1
  • python 是一门优雅的语言,有些使用方法就像魔法一样。装饰器(decorator)就是一种化腐朽性为神奇的技巧...
    人世间阅读 7,501评论 6 54
  • 我对Python装饰器的理解就是用一个函数去修饰另外一个函数。 装饰器 在运行原来功能的基础上,添加一些新的功能...
    敢梦敢当阅读 275评论 0 1
  • 我们定义如下函数,将输入参数乘2并返回 如果我们要求输入参数x必须为int型,否则返回None,可以通过定义函数f...
    榆鸦k阅读 195评论 0 0
  • python装饰器是在函数调用之上的修饰,这些修饰是在声明或者定义一个函数的时候进行设置的。同时,装饰器是一个返回...
    happy_19阅读 666评论 0 5