python3_装饰器

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2018/5/4 14:00
# @Author  : chen
# @File    : 装饰器练习题.py
# @Software: PyCharm

# 装饰器的定义:



# 代码的运行、有定义阶段和执行(调用)阶段。。定义阶段不会开辟内存放里面的变量啥的。。
# 内存开辟、只是在调用的过程中,没被调用的函数及函数内部的变量不会被开辟,但是函数本身会被放到内存。。。
# 闭包,即内部的函数定义只有在调用了外部函数才会进行定义和执行的过程


# :编写3个函数,每个函数执行的时间是不一样的,
# 提示:可以使用time.sleep(2),让程序sleep 2s或更多,
# 二:编写装饰器,为每个函数加上统计运行时间的功能
# 提示:在函数开始执行时加上start=time.time()就可纪录当前执行的时间戳,函数执行结束后在time.time() - start就可以拿到执行所用时间
# 三:编写装饰器,为函数加上认证的功能,即要求认证成功后才能执行函数
# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码


import time

# status = False
user_info = {
    'status': False
}


def time_count(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        time_sleep = time.time() - start
        print(time_sleep)
    return wrapper


def auth(user_status):
    def inner(func):
        def wrapper(*args, **kwargs):
            while True:
                if user_status['status']:

                    return func(*args, **kwargs)
                else:

                    user_name = input("input your name:").strip()
                    user_password = input('input your password').strip()
                    if user_name == '':
                        continue
                    if user_name == 'alex' and user_password == '123':
                        print('登录成功!')
                        user_status['status'] = True
                        return func(*args, **kwargs)
                    else:
                        print('用户名或密码错误!')
                        break
        return wrapper
    return inner


@auth(user_info)
@time_count
def func2():
    time.sleep(2)
    print('sleep 2 seconds')


@auth(user_info)
@time_count
def func3():
    time.sleep(3)
    print('sleep 3 seconds')


@auth(user_info)
@time_count
def func4():
    time.sleep(4)
    print('sleep 4 seconds')


func2()
func3()
func4()


# 这里使用user_info字典,然后可以在装饰器里可以修改字典里的内容
# 传参等于复制
# 用容器类型也是复制,但是不是深拷贝所以没问题

猜你喜欢

转载自blog.csdn.net/u013193903/article/details/80198884