1、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件)要求登录成功一次,后续的函数都无需再输入用户名和密码

FLAG = False
def login(func):
def inner(*args,**kwargs):
global FLAG
if FLAG:
ret = func(*args,**kwargs)
return ret
else:
#登录程序
username = input('请输入用户名:')
password = input('请输入密码:')
if username == 'ysg' and password == "":
FLAG = True
ret = func(*args,**kwargs)
return ret
else:
print("登录失败")
return inner @login
def shoplist_add():
print("向购物车中添加物品") @login
def shoplist_del():
print("向购物车中添加物品") shoplist_add()
shoplist_del()
FLAG = False
def login(f):
def inner(*args,**kwargs):
#判断是否以成功登录
global FLAG
if FLAG:
ret = f(*args,**kwargs)
return
else:
#登录验证
use = input('>>>')
pwd = input('>>>')
lis=[]
with open('E:/py/info.txt','r',encoding='utf-8')as info:
for i in info:
lis.append(i)
if use == lis[0].strip() and pwd == lis[1].strip():
print('登陆成功')
FLAG = True
ret = f(*args,**kwargs)
return ret
else:
print('登录失败')
return inner @login
def shoping():
print('在购物')
@login
def money():
print('在支付') shoping()
money()

2、编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件

def log(func):
def inner(*arge,**kwargs):
with open('E:/py/log/log.txt','a',encoding='utf-8') as f:
f.write(func.__name__ + '\n')
ret = func(*arge,**kwargs)
print("")
return ret
return inner @log
def shoplist_add():
print("购买了一件商品") @log
def shoplist_del():
print("删除了一件商品") shoplist_add()
shoplist_del()
shoplist_add()
shoplist_del()
shoplist_add()
shoplist_del()

进阶练习:
1.编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
2.为题目1编写装饰器,实现缓存网页内容的功能:
具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先文件中读取网页内容,否则,就去下载,然后存到文件中

import os
from urllib.request import urlopen
def cache(func):
def inner(*arge,**kwargs):
if os.path.getsize('E:/py/log/url.txt'):
with open ("E:/py/log/url.txt","rb") as f:
return f.read()
ret = func(*arge,**kwargs)
with open('E:/py/log/url.txt','wb') as f:
f.write(ret+b"*****")
return ret
return inner @cache
def get(url):
code = urlopen(url).read()
return code ret = get('http://www.baidu.com')
print(ret) ret = get('http://www.baidu.com')
print(ret)

day 11 - 2 装饰器练习的更多相关文章

  1. day 11 - 1 装饰器

    装饰器 装饰器形成的过程:最简单的装饰器——有返回值的——有一个参数——万能参数装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能原则:开放封闭原则语法糖:@装饰器函数名装饰器的固 ...

  2. Django-website 程序案例系列-11 验证装饰器

    FBV装饰器: def auth(func): #装饰器函数 def inner(request, *args, **kwargs): v = request.COOKIES.get('usernam ...

  3. Python学习:11.Python装饰器讲解(二)

    回顾 上一节我们进行了Python简单装饰器的讲解,但是python的装饰器还有一部分高级的使用方式,这一节就针对python装饰器高级部分进行讲解. 为一个函数添加多个装饰器 今天,老板又交给你一个 ...

  4. Day 11:函数装饰器

    在说装饰器前,先说一个东西,再Python里,有一个 一切皆对象,一切皆变量. 例: def hello(name="sunjinyao"): return "hi &q ...

  5. 总结了11条,我对Python 装饰器的理解

    对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...

  6. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  7. Python核心编程 | 装饰器

        装饰器是程序开发的基础知识,用好装饰器,在程序开发中能够提高效率 它可以在不需要修改每个函数内部代码的情况下,为多个函数添加附加功能,如权限验证,log日志等   涉及点:   1.先梳理一下 ...

  8. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  9. Python小白学习之函数装饰器

    装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...

随机推荐

  1. Java实现二叉树的前序、中序、后序、层序遍历(递归方法)

      在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了.   二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一 ...

  2. springmvc启动问题

    1.resource项目 freemarker.template.TemplateNotFoundException: Template not found for name "index/ ...

  3. 改xml

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  4. 对manacher的一点感性理解

    因为总是忘掉板子所以这里贴一下我个人对\(manacher\)的感性理解. 可能不够严谨求轻喷\(QwQ\) char ch = getchar (); s[0] = s[1] = '#'; whil ...

  5. 构造方法关键字---this

    this 可以在构造方法之间进行调用 *this在构造方法之间调用 this() this 可以在构造方法之间进行调用 *this在构造方法之间调用 this() package cn.homewor ...

  6. 使用Thumb

    目录 使用Thumb title: 使用Thumb tags: ARM date: 2018-10-24 19:28:32 --- 使用Thumb C文件使用编译选择增加 -mthumb即可,修改ma ...

  7. flask session

    flask session工作机制: 把敏感数据经过加密后放入到‘session’中,然后在把'session'存放到cookie中,下次请求的时候,再从浏览器发送过来的cookie中读取sessio ...

  8. 数据库基础SQL知识面试题二

    数据库基础SQL知识面试题二 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选课系统SQL语法练习 course数据库中有以下四张表: •students表(学生表): si ...

  9. Jquery Pagination分页插件使用

    JqueryPagination是个简单轻量级的分页插件,使用起来很容易,只要初始化一个实例,并设置总数量.翻页回调函数.其它参数就可以实现无刷新分页功能了. 准备工作 下载jquery.min.js ...

  10. setAttribute和setParameter方法的区别

    getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 getParame ...