【python 装饰器】五分钟学会Python装饰器

一、装饰器本质
本质上就是一个高阶函数 ,指的是函数的函数,类似 导数的导数一样。

二、任意参数
在介绍装饰器的具体使用之前,我们先来了解和熟悉一下Python当中的任意参数。
Python当中支持任意参数,它写成*args, **kw。表示的含义是接受 任何形式的参数 。

举个例子,比如我们定义一个函数:

def exp(a, b, c='3', d='f'):
    print(a, b, c, d)
我们可以这样调用:

args = [1, 3]
dt = {'c': 4, 'd': 5}

exp(*args, **dt)

我们传入list和dict的时候前面加上了*和**,它表示 将list和dict当中的所有值展开 。如果不加的话,list和dict会被当成是整体传入。

三、定义装饰器
明白了任意参数的写法之后,装饰器就不难了。

既然我们可以用*args, **kw接受任何参数。并且Python当中支持一个函数作为参数传入另外一个函数,如果我们把函数和这个函数的所有参数全部传入另外一个函数,那么不就可以实现 代理 了吗?

from functools import wraps

def wrapexp(func):
    def wrapper(*args, **kwargs):
        print('this is a wrapper')
        func(*args, **kwargs)
    return wrapper


@wrapexp
def exp(a, b, c='3', d='f'):
    print(a, b, c, d)


args = [1, 3]
dt = {'c': 4, 'd': 5}

exp(*args, **dt)

在这个例子当中,我们定义了一个wrapexp的装饰器。我们在其中的wrapper方法当中实现了装饰器的逻辑, wrapexp当中传入的参数func是一个函数 ,wrapper当中的参数则是func的参数。所以我们在wrapper当中调用func(*args, **kw),就是调用打上了这个注解的函数本身。比如在这个例子当中,我们没有做任何事情,只是在原样调用之前多输出了一行’this is a wrapper’,表示我们的装饰器调用成功了。

四、装饰器用途
我们理解了装饰器的基本使用方法之后,自然而然地会问一个天然的问题,学会了它 究竟有什么用呢?

装饰器最大的用途,可以 在不修改函数内部代码的前提下,为它包装一些额外的功能。

比如 计算 每个函数的耗时时间。

import time
from functools import wraps
def timethis(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(func.__name__, end-start)
        return result
    return wrapper

装饰器是Python进阶必学的技能之一 。想要熟练掌握这门语言,灵活运用,看懂大佬的源码,装饰器是必须会的东西。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读