打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2020Python练习

课后练习——装饰器

一:编写函数,(函数执行的时间用time.sleep(n)模拟)

import timedef index(x,y):    time.sleep(3)    print('index %s %s' %(x,y))index(111,222)

 

二:编写装饰器,为函数加上统计时间的功能

import timedef index(x,y):    start=time.time()    time.sleep(3)    print('index %s %s' %(x,y))    stop = time.time()    print(stop - start)index(111,222)

 

三:编写装饰器,为函数加上认证的功能 

def auth(func):    def wrapper(*args, **kwargs):        # 1、调用原函数        # 2、为其增加新功能        name = input('your name>>: ').strip()        pwd = input('your password>>: ').strip()        if name == 'egon' and pwd == '123':            res = func(*args, **kwargs)            return res        else:            print('账号密码错误')    return wrapper@authdef index():    print('from index')index()

 

四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式 

db='db.txt'login_status={'user':None,'status':False}def auth(auth_type='file'):    def auth2(func):        def wrapper(*args,**kwargs):            if login_status['user'] and login_status['status']:                return func(*args,**kwargs)            if auth_type == 'file':                with open(db,encoding='utf-8') as f:                    dic=eval(f.read())                name=input('username: ').strip()                password=input('password: ').strip()                if name in dic and password == dic[name]:                    login_status['user']=name                    login_status['status']=True                    res=func(*args,**kwargs)                    return res                else:                    print('username or password error')            elif auth_type == 'sql':                pass            else:                pass        return wrapper    return auth2@auth()def index():    print('index')@auth(auth_type='file')def home(name):    print('welcome %s to home' %name)index()home('mili')

 

五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录 

import time,randomuser={'user':None,'login_time':None,'timeout':0.000003,}def timmer(func):    def wrapper(*args,**kwargs):        s1=time.time()        res=func(*args,**kwargs)        s2=time.time()        print('%s' %(s2-s1))        return res    return wrapperdef auth(func):    def wrapper(*args,**kwargs):        if user['user']:            timeout=time.time()-user['login_time']            if timeout < user['timeout']:                return func(*args,**kwargs)        name=input('name>>: ').strip()        password=input('password>>: ').strip()        if name == 'egon' and password == '123':            user['user']=name            user['login_time']=time.time()            res=func(*args,**kwargs)            return res    return wrapper@authdef index():    time.sleep(random.randrange(3))    print('welcome to index')@authdef home(name):    time.sleep(random.randrange(3))    print('welcome %s to home ' %name)index()home('mili')

 


六:选做题
# 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
# @deco1 # index=deco1(deco2.wrapper的内存地址)
# @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
# @deco3 # deco3.wrapper的内存地址=deco3(index)
# def index():
# pass

 https://www.cnblogs.com/bigorangecc/p/12552940.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
24、Python之有参装饰器
python装饰器详解
装饰器的补充以及迭代器
装饰器_装饰器flage = true
《源码探秘 CPython》64. 装饰器是怎么实现的?
从零开始学Python:21课-函数的高级应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服