python学习之路:十二.装饰器

一.装饰器的简易版本

# 统计函数的执行时间
import time


def index():
    time.sleep(2)
    print('from index')


def home():
    time.sleep(3)
    print('from home')

def outer(func):
    # func = index

    def get_time():
        # 1. 统计一下函数执行前的时间戳
        start_time = time.time()
        func()

        # 2. 统计一下函数执行完之后的时间戳
        end_time = time.time()

        # 3. 计算差值
        print('函数执行时间:%s' % (end_time - start_time))

    return get_time


index = outer(index)  # res=>get_time的内存地址
index()  # get_time()

二.装饰器进阶版本

def outer(func):
    # func = index

    def get_time(*args, **kwargs):
        # 1. 统计一下函数执行前的时间戳
        start_time = time.time()
        func(*args, **kwargs)  # login()

        # 2. 统计一下函数执行完之后的时间戳
        end_time = time.time()

        # 3. 计算差值
        print('函数执行时间:%s' % (end_time - start_time))

    return get_time


login = outer(login)  # res=>get_time的内存地址
login('ly')  # get_time()

index=outer(index)
index()

三.解决函数返回值的问题

def login(name):
    time.sleep(1)
    print('from home', name)
    return 'from login'

def outer(func):
    # func = index

    def get_time(*args, **kwargs):
        # 1. 统计一下函数执行前的时间戳
        start_time = time.time()
        res=func(*args, **kwargs)  # login()

        # 2. 统计一下函数执行完之后的时间戳
        end_time = time.time()

        # 3. 计算差值
        print('函数执行时间:%s' % (end_time - start_time))
        return res
    return get_time


login = outer(login)  # res=>get_time的内存地址
res=login('ly')  # get_time()
print(res)

四.装饰器固定模板

def outer(func):
    def inner():
        print('函数执行之前要执行的代码')
        res = func()
        print('函数执行之后要执行的代码')
        return res

    return inner

五.装饰器的语法糖

def outer(func):
    def inner():
        start_time = time.time()
        res = func()
        end_time = time.time()
        print('函数执行时间:%s' % (end_time - start_time))
        return res

    return inner


# 统计函数的执行时间
@outer  # # index = outer(index)
def index():
    time.sleep(3)
    print('from index')

index()
'''
    装饰器语法糖的执行流程:
        把语法糖下面紧贴着的函数名当成参数传递给装饰器函数参数
'''


@outer  # home = outer(home)
def home():
    print('from home')

home()

六.装饰器双层语法糖

# 统计函数执行时间的装饰器
import time


def get_time(func):
    def inner():
        start_time = time.time()
        res = func()
        end_time = time.time()
        print('函数执行时间:%s' % (end_time - start_time))
        return res

    return inner


# 认证装饰器
def login_auth(func):
    # func = index
    def auth():
        # 1. 让用户输入用户名和密码
        username = input('username:').strip()
        password = input('password:').strip()

        # 2. 判断用户名和密码
        if username == 'ly' and password == '123':
            func()  # inner()
        else:
            print('输入错误,不能调用函数')

    return auth  # 一定别忘记把内层函数的函数名返回出去


@login_auth # index=login_auth(inner)  #index=>auth的内存地址
@get_time  # inner=get_time(index)
def index(): # def auth()
    time.sleep(2)
    print('from index')


index()  # auth()

七.有参装饰器

# 认证装饰器
def outter(source_data, a, b,c):
    # source_data = 'file'
    def login_auth(func):
        # func = index
        def auth( *args, **kwargs):
            # 1. 让用户输入用户名和密码
            # username = input('username:').strip()
            # password = input('password:').strip()
            if source_data == 'file':
                print('从文件中读数据')
            elif source_data =='mysql':
                print('从mysql中读取数据')
            elif source_data == 'oracle':
                print('从oracle中读取数据')


        return auth  # 一定别忘记把内层函数的函数名返回出去
    return login_auth
@outter('file', 1, 2,3)  # outter('file')    @login_auth
def index():
    pass
index()

 

posted @ 2022-01-10 20:11  morningstar999  阅读(36)  评论(0)    收藏  举报