装饰器

装饰器

装饰器的定义:

  1. 完全遵循开放封闭的原则(开放:增加新功能 封闭:不改变原函数代码)
  2. 在不改变原函数的代码及调用方式的前提下,为其增加新的功能
  3. 装饰器的本质就是一个闭包函数
  4. 装饰器必须放在函数的最上面
  • 被装饰函数中不带返回值的装饰器
def times(f):                #1   #3
    #此处的f是自由变量(f=func)
    def inner():             #4   #7
        w_times=time.time()  #8
        f()                  #9
        e_times=time.time()  #13
        print(e_times)          #14
    return inner   #此处的inner返回的是func                #5

@times # func=times(func)      #2   #10
def func():
    time.sleep(2)            #11
    print('王敏敏是憨憨!')     #12
func()     #此处的func调用的是inner      #6
  • 被装饰器函数中带返回值的装饰器
def times(f):
    #此处的f是自由变量(f=func)
    def inner():
        w_times=time.time()
        r=f()          #此处调用的才是func函数,他的返回值才是666,我们可以把返回值设置一个变量,再把这个变量返回给inner函数
        e_times=time.time()
        print(e_times)
        return r   #此处就把666返回给了func(实际上是inner)
    return inner   #此处的inner返回的是func

@times # func=times(func)
def func():
    time.sleep(2)
    print('王敏敏最憨憨!')
    return 666
ret=func()   #此处的ret调用的是inner函数,所以接受不到返回值666,而真正的func函数是times中的自由变量f
print(ret)
  • 被装饰器函数中带参数的装饰器
def times(f):
    #此处的f是自由变量(f=func)
    def inner(n):
        w_times=time.time()
        r=f(n)
        e_times=time.time()
        print(e_times)
        return r   #此处就把666返回给了func(实际上是inner)
    return inner   #此处的inner返回的是func

@times # func=times(func)
def func(a):
    time.sleep(2)
    print(f'王敏敏最憨憨!{a}')
    return 666
ret=func('hhhhh')   #借助inner函数进行传参(先把参数传给inner,在把参数传给f(此处的f是func的调用者))
print(ret)
  • 一个完整的装饰器
import time
def times(f):
    #此处的f是自由变量(f=func)
    def inner(*args,**kwargs):  #此处是函数的定义,*、**代表聚合  得元组('hhhhh',12)
        w_times=time.time()
        r=f(*args,**kwargs)     #此处是函数的调用,*,**代表打散  得  'hhhhh',12
        e_times=time.time()
        print(e_times)
        return r   #此处就把666返回给了func(实际上是inner)
    return inner   #此处的inner返回的是func

@times # func=times(func)
def func(a,b):
    time.sleep(2)
    print(f'王敏敏最憨憨!{a}{b}')
    return 666
ret=func('hhhhh',12)   #借助inner函数进行传参(先把参数传给inner,在把参数传给f(此处的f是func的调用者))
print(ret)

装饰器传参

  • 装饰器传参就是在装饰器最外面在添加一层函数

import time

def fw(path):
    def wrapper(f):
        def inner(*args, **kwargs):
            s = time.strftime('%Y-%m-%d %H:%M:%S')
            print(s)
            p = f(*args, **kwargs)
            s = time.strftime('%Y-%m-%d %H:%M:%S')
            with open(path, mode='a', encoding='utf-8')as f1:
                f1.write(f'{s}执行了{f.__name__}函数\n')
            print(s)
            return p

        return inner
    return wrapper



@fw('time')
def func(a):
    print(a)
    # time.sleep(3)
    return '123'
s=func(10)
print(s)



@fw('time1')
def func2(a):
    print(a)
    # time.sleep(3)
    return '123'
s=func2(10)
print(s)
posted @ 2021-06-04 19:14  刘家小仙女  阅读(44)  评论(0编辑  收藏  举报