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. 美丽的webpack-bundle-analyzer

    webpack-bundle-analyzer -- Webpack 插件和 CLI 实用程序,她可以将打包后的内容束展示为方便交互的直观树状图,让我们知道我们所构建包中真正引入的内容: 我们可以借助 ...

  2. 第二十四节,TensorFlow下slim库函数的使用以及使用VGG网络进行预训练、迁移学习(附代码)

    在介绍这一节之前,需要你对slim模型库有一些基本了解,具体可以参考第二十二节,TensorFlow中的图片分类模型库slim的使用.数据集处理,这一节我们会详细介绍slim模型库下面的一些函数的使用 ...

  3. Codeforces Round #523 (Div. 2) D. TV Shows

    传送门 https://www.cnblogs.com/violet-acmer/p/10005351.html 题意: 有n个节目,每个节目都有个开始时间和结束时间. 定义x,y分别为租电视需要的花 ...

  4. JS学习笔记Day1

    一.JS概述 1.什么是JS? 是一种基于对象和事件驱动的客户端脚本语言: 运行环境:浏览器(通过浏览器解释执行) 2.JS产生于哪一年,哪个公司,是谁?第一个名字是什么? 1995年,网景公司.布兰 ...

  5. Vue(基础六)_嵌套路由(续)

    一.前言                  1.路由嵌套里面的公共路由                  2.keep-alive路由缓存                  3.导航守卫 二.主要内容 ...

  6. RS485 / RS422

    RS422可以变为RS485:A和Y短路(然后接T/R+),B和Z短路(然后接T/R-) RS485是半双工,只有两根线通信线,要么接收状态,要么发送状态 RE为低电平,作为接收器 DE为高电平,作为 ...

  7. [HNOI2003]消防局的设立 树形dp // 贪心

    https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...

  8. 购物demo

    这段时间从一个模板网站上拷了个购物系统的demo,试着写了一下,发现div+css布局还真是精妙无穷呢.设置好了布局,加上动态效果也只是锦上添花而已.所以,接下来的重点就是布局了! 我把网址粘上去:h ...

  9. 剑指Offer_编程题_14

    题目描述 输入一个链表,输出该链表中倒数第k个结点. /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : va ...

  10. MyBatis-DynamicSQL 动态SQL

    MyBatis 的动态 SQL 使用 OGNL 表达式 http://commons.apache.org/proper/commons-ognl/language-guide.html 在 XML ...