假期python复习3

装饰器进阶

带参数的装饰器

500个函数

@wrapper要500遍

@timmer_out(FLAGE)
def timmer_out(flag):
    def timmer(func):
        def inner(*args, **kwargs):
            if flag:
                start = time.time()
                ret = func(*args, **kwargs)
                end = time.time()
                print(end - start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret

        return inner

    return timmer

首先是执行函数timmer_out(FLAGE)然后返回timmer

前面的@加返回的timmer构造语法糖

过程为timmer_out(FLAG) == timmer

@timmer == wahaha = timmer(wahaha)

多了一个参数,多次调用

可以理解为

timmer = timmer_out(FLAGE)

然后@timmer原理一样

这样可以控制装饰器是否使用并且可以控制多个装饰器

# 带参数的装饰器
# 500个函数
import time

FLAGE = True

def timmer_out(flag):
    def timmer(func):
        def inner(*args, **kwargs):
            if flag:
                start = time.time()
                ret = func(*args, **kwargs)
                end = time.time()
                print(end - start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret

        return inner

    return timmer
# FLAGE = False

@timmer_out(FLAGE)
def wahaha():
    time.sleep(0.1)
    print("wahaha")


@timmer_out(FLAGE)
def erguotou():
    time.sleep(0.5)
    print('erguotou')




wahaha()

erguotou()

一个函数被多个装饰器装饰

流程:

先运行第一个装饰器运行到被装饰函数之前的代码

在运行第二个装饰器运行到被装饰函数之前的代码

运行被装饰函数

在运行第二个装饰器运行被装饰函数之后的代码

在运行第一个装饰器运行被装饰函数之后的代码

语法糖先执行离函数近的

所以下面列子先执行wrapper1在执行wrapper2

# 多个装饰器装饰一个函数

def wrapper1(func):
    def inner1():
        print("wrapper 1     before func------")
        func()  # --->func()
        print('warpper 1     after  func------')

    return inner1


def wrapper2(func):
    def inner2():
        print("wrapper 2     before func------")
        func()  # innner1()
        print('warpper 2     after  func------')

    return inner2


@wrapper2  # f = wrapper2(f)  ---> wrapper2(inner1) == inner2
@wrapper1  # f = wrapper1(f)  = inner1
def func():
    print('in func')


func()  # ---->inner2()

记录用户的登入日志

计算这个函数的执行时间

如果这样要先写用户的登入日志装饰器在使用执行时间的装饰器

posted @ 2021-01-15 16:35  20181235  阅读(36)  评论(0编辑  收藏  举报