首页 > 技术文章 > 函数之装饰器

fangjie0410 2017-08-31 18:56 原文

一 什么是装饰器

 装饰器的定义:在不修改其他函数名和函数内部的代码的同时还可以给该函数添加功能

  装饰器的开放封闭原则:对扩张是开放的,对修改是封闭的。

 装饰器的好处:1 随时都可以调用;2 在另一个函数前后可以添加新的功能。

  装饰器的第一个函数的参数就是要被调用的函数:它有返回值和参数。

  在其他人调用该函数的时候,是不会发觉该函数有装饰器给装饰的 。

二 装饰器的格式

 装饰器的格式:def 函数名1(参数):这里的参数就是代替需要装饰的函数名

          def 函数名2(*args,**kwargs):

            添加功能

            执行函数(*args,**kwargs)这里的函数执行,就是外层的参数执行

            添加功能

            return 执行函数后赋值的对象

          return 函数名2

  装饰器本身就是一个函数,属于闭包函数的一种。

# import time
# def cache(func):
#     def inner(*args,**kwargs):
#         qq=time.time()
#         res=func(*args,**kwargs)
#         print(time.time()-qq)
#         return res
#     return inner

 使用方法:就是在需要调用的函数上面一行加上(@装饰器名称),

  装饰器还可以多个同时使用,多个装饰器同时使用时:装饰器从下到上加载,从上到下执行 

三 有参装饰器

 1 有参装饰器的定义:就是在无参的装饰器外面在包上一层有参函数,是一个三层的嵌套函数

 2 有参装饰器的调用:调用时用最外层的函数作为装饰器的名称,然后再给装饰器传入一个参数。

 3 有残装饰器的好处:在多个函数调用有参装饰器时,,可以同时控制这些函数调用的装饰器是否执行。

 4 有参装饰器格式:

  def 函数名1(参数):  这个参数是来控制装饰器是否执行

    def 函数名2(参数2):  这个参数使用来接收要调用的函数名

      def 函数名3(*args,**kwargs):  不确定调用函数传入的参数个数多少,所以用动态参数来接收

        添加功能

        赋值变量名1=执行参数2(*args,**kwargs)     也就是要调用这个装饰器的函数  而动态参数在这里就是将传入进来的参数值打散

        添加功能

        return 赋值变量名1

      return 函数名3

    return 函数名2

tag_1=True
def cache_1(TAG):
    def cache(func):
        import time
        def inner(*args,**kwargs):
            qq=time.time()
            time.sleep(3)
            res=func(*args,**kwargs)
            if tag_1:
                print(time.time()-qq)
            return res
        return inner
    return cache
@cache_1(tag_1)
def index():
    print('1111232')
index()

推荐阅读