装饰器

本节在这里和大家展示一下装饰器的使用,以及原理

装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python

当你在公司里调试代码的时候,发现以下代码的运行时间过长,于是你意识到可能有需要优化的地方:

def func1():
    pass

def func2():
    pass

def func3():
    pass

def func4():
    pass
但是写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
封闭:已实现的功能代码块

开放:对扩展开发

所以,你不能直接在每个函数内部进行调试,以免破坏代码的稳定性。但是,在每个调用函数的前后执行的计时操作的话,如果函数量足够大的话,会造成代码量的冗余,且浪费时间。那么,这个时候该如何进行代码的检查呢?这里就可以用到装饰器了:

import time

def check_time(func):
    
    def inner_func():
        start_time = time.time()
        res = func()                    # 调用原函数,并获得原函数的返回值
        end_time = time.time()
        time_consuming = end_time - start_time          # 计算耗时时间
        print("函数 < %s > 总共耗时 %s"%(func.__name__,time_consuming))
        return res        返回原函数的返回值

    return inner_func       # 返回内部函数的引用

@check_time
def func1():
    pass

@check_time
def func2():
    pass

@check_time
def func3():
    pass

@check_time
def func4():
    pass

这样,就能在不该变原函数的代码结构的情况下,就能对每个函数的执行耗时情况一目了然了。

那么,装饰器既然可以这样使用,那么他的使用原理是什么呢?

装饰器_第1张图片

装饰器的几大功能:

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备处理
  4. 执行函数后清理功能
  5. 权限校验等场景
  6. 缓存

在工作中,装饰器的使用时必须的,一个合格的员工都应该了解和掌握装饰器。其实,装饰器不仅仅局限于用函数进行装饰,还有类当装饰器,下面是我用类装饰器写的一段代码,大家可以参考一下:

class A(object):
    """ 将A充当类装饰器 """
    def __init__(self,func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("类装饰器开始执行啦--------")
        self.func()
        print("类装饰器执行结束啦--------")


@A
def test():
    print("this is test!")

test()
装饰器其实还有很多用法和复杂的装饰器,比如装饰器传参啊,还有几个装饰器共同装饰同一个函数等等。只不过因为时间和篇幅有限,今天就先到这里了,感谢大家的阅读!

你可能感兴趣的:(基础阶段)