python 装饰器,登录小练习

为君一笑 提交于 2019-11-28 04:36:11

装饰器

无参装饰器

装饰器

import time
def timmer(func):
    def wrapper(*args, **keargs):
        start = time.time()
        res = index
        stop = time.time()
        print('run time is %f' % (stop - start))
    return wrapper

@timmer # 装饰器   index = timmel(index)
def index():
    time.sleep(3)  # 把函数运行时间延长三秒
    print('welconme!')

index() # timmer(index()) 个人理解

import time

def timmer(func):   # 闭包函数
    def wrapper():
        print(func)
        start_time=time.time()
        func()
        stop_time=time.time()
        print('run time is %f'%(stop_time-start_time))
    return wrapper

@timmer     # 装饰语法
def index():    # 被装饰对象
    time.sleep(3)
    print('welcome!')

index()

#上面的运行结果
<function index at 0x10217b9d8>
welcome!
run time is 3.000330
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)
        stop_time=time.time()
        print('tun time is %f'% (stop_time-start_time))
    return wrapper

@timmer
def home(name):
    time.sleep(2)
    print("welconme to %s!"% name)

@timmer
def auth(name,passwd):
    print(name,passwd)

@timmer
def tell():
    print('-'*20)

home('egon')
auth('alex','123')
tell()
#上面运行结果
welconme to egon!
tun time is 2.002392
alex 123
tun time is 0.000015
--------------------
tun time is 0.000007
import time
def timmer(func): #计算函数运行时间
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs) #func(*args,**kwargs) 如果不赋值,最终打印出来的结果会出现None 
        stop_time=time.time()
        print('tun time is %f'% (stop_time-start_time))
        return res  # 要是用到返回值,装饰器也和被装饰的函数一样需要返回值 return
    return wrapper

@timmer
def my_max(x,y): #返回最大值
    print('from to my_max')
    res=x if x>y else y
    return res


print(my_max(2,3))

有参装装饰器

def auth2(auth_type):
    def auth(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                name=input("username: ")
                passwd=input("password: ")
                if name == 'name' and passwd=='123':
                    print('auth successfull')
                    res=func(*args,**kwargs)
                    return res
                else:
                    print("auth error")
            elif auth_type=='sql':
                print('还不会')
        return wrapper
    return auth

@auth2( auth_type = 'sql' ) # auth index = auth (index)
def index():
    print('welcome to index.')

index()

多层装饰器

# 无参
@ccc
@bbb
@aaa    
def func():
    pass

func=aaa(func)
func=bbb(aaa(func))
func=ccc(bbb(aaa(func)))

# 有参
@ccc('c')
@bbb('b')
@aaa('a')
def func():
    pass
# @aaa('a')
func=aaa('a')(func)
# @bbb('b')
func=bbb('b')(aaa('a')(func))
# @ccc('c')
func=ccc('c')(bbb('b')(aaa('a')(func)))

重复认证

courent_login={'name':None,'login':False} # 登录状态
def auth2(auth_type='file'): # 加了默认参数
    def auth(func):
        def wrapper(*args,**kwargs):
            if courent_login['name'] and courent_login['login']: # 判断是否登录
                res=func(*args,**kwargs)
                return res # 已登录直接返回数据
            if auth_type == 'file':
                name=input("username: ")
                passwd=input("password: ")
                if name == 'name' and passwd=='123':
                    print('auth successfull')
                    res=func(*args,**kwargs)
                    courent_login['name']=name  # 把登录的用户添加到登录状态里面
                    courent_login['login']=True # 把当前用户登录状态添加到courent_login
                    return res
                else:
                    print("auth error")
            elif auth_type=='sql':
                print('还不会')
        return wrapper
    return auth
# 定义阶段
@auth2( auth_type = 'file' ) # auth index = auth (index)
def index():
    print('welcome to index.')

@auth2()
def home():
    print("from to index")

# 调用阶段
index()
home()

作业

1

import time
def timmer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args,**kwargs)
        stop = time.time()
        print('run time is %f' % (stop - start))
    return wrapper
# 装饰器   index = timmel(index)
@timmer
def index():    # 无参函数
    time.sleep(3)  # 把函数运行时间延长三秒
    print('welconme!')

@timmer
def auth(name,passwd):  # 有参函数 两个参数
    print(name,passwd)

@timmer
def home(name): # 有参函数 一个参数
    print(name)

index()
auth("egon",'passwd')
home('name')

2

以装饰器来3次登录,不更改源代码的情况下,增加计算函数运行时间

import os,time

tag = True
usr_dict = {}
courent_login={'name':None,'login':False} # 避免重复登录
# 计算函数运行时间
def timmer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args,**kwargs)
        stop = time.time()
        print('run time is %f' % (stop - start))
    return wrapper

def auth2(auth_type='file'):    # 加了默认参数auth_type='file'
    def auth(func):
        def wrapper(*args,**kwargs):
            if courent_login['name'] and courent_login['login']:
                res=func(*args,**kwargs)
                return res
            if auth_type == 'file':
                with open("usr.conf", encoding="utf8") as usr_file, open("usr1.conf", encoding="utf8", mode="w") as usr1_file:
                    usr_name = usr_file.read()
                    usr_dict = eval(usr_name)
                    count = 0
                    tag = True
                    while tag:
                        usrname = input("\t输入'q',退出\nplease username:").strip()
                        if usrname in usr_dict.keys() :
                            passwd = input("please password:").strip()
                            if int(usr_dict[usrname][1]) < 3 and count < 5:
                                if passwd == usr_dict[usrname][0]:
                                    res=func(*args,**kwargs)
                                    courent_login['name']=usrname
                                    courent_login['login']=True
                                    return res
                                else:
                                    usr_dict[usrname][1] = int(usr_dict[usrname][1]) + 1
                                    print("username or password is wrong")
                                    usr = str(usr_dict)
                                    usr1_file.write(usr)
                                    usr1_file.flush()
                                    os.rename("usr.conf", "usr2.conf")
                                    os.rename("usr1.conf", "usr.conf")
                            else:
                                print("User is locked")
                                continue
                        elif usrname == 'q':
                                print(usr_dict)
                                usr=str(usr_dict)
                                usr1_file.write(usr)
                                usr1_file.flush()
                                os.rename("usr.conf", "usr2.conf")
                                os.rename("usr1.conf", "usr.conf")
                                break
                        else:
                            if usrname != usr_dict.keys():
                                count += 1
                                print("not username")
            elif auth_type=='sql':
                print("还不会")
        return wrapper
    return auth

@timmer
@auth2(auth_type='file')
def index():
    print("welcome!")

@timmer
@auth2()
def home():
    print("from to home")

index()
home()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!