day 11 - 2 装饰器练习
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 装饰器练习的更多相关文章
- day 11 - 1 装饰器
装饰器 装饰器形成的过程:最简单的装饰器——有返回值的——有一个参数——万能参数装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能原则:开放封闭原则语法糖:@装饰器函数名装饰器的固 ...
- Django-website 程序案例系列-11 验证装饰器
FBV装饰器: def auth(func): #装饰器函数 def inner(request, *args, **kwargs): v = request.COOKIES.get('usernam ...
- Python学习:11.Python装饰器讲解(二)
回顾 上一节我们进行了Python简单装饰器的讲解,但是python的装饰器还有一部分高级的使用方式,这一节就针对python装饰器高级部分进行讲解. 为一个函数添加多个装饰器 今天,老板又交给你一个 ...
- Day 11:函数装饰器
在说装饰器前,先说一个东西,再Python里,有一个 一切皆对象,一切皆变量. 例: def hello(name="sunjinyao"): return "hi &q ...
- 总结了11条,我对Python 装饰器的理解
对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- Python核心编程 | 装饰器
装饰器是程序开发的基础知识,用好装饰器,在程序开发中能够提高效率 它可以在不需要修改每个函数内部代码的情况下,为多个函数添加附加功能,如权限验证,log日志等 涉及点: 1.先梳理一下 ...
- 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现
课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...
- Python小白学习之函数装饰器
装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...
随机推荐
- 编译 pcre - 开源的正则表达式(库)
PCRE百科介绍: PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl ...
- 【非专业前端】Vue UI 之 建立Vuetify工程
先建立一个工程[Webpack] .. ..建立好之后,进入目录,添加vuetify插件 cd vuetify-demo vue add vuetify[会出错] npm install vuetif ...
- POJ 3352 Road Construction ; POJ 3177 Redundant Paths (双联通)
这两题好像是一样的,就是3177要去掉重边. 但是为什么要去重边呢??????我认为如果有重边的话,应该也要考虑在内才是. 这两题我用了求割边,在去掉割边,用DFS缩点. 有大神说用Tarjan,不过 ...
- 配置ssl
1.配置 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000&q ...
- 2018ccpc湖南邀请赛后记
第一次出省去打邀请赛,赛前给队友定的目标是打个铜,这样奖金就可以报销我们的伙食费了 5.12 热身赛,ak的心态冲进去,爆零逃出来 (为什么热身赛没有签到题啊),出来一度以为这场比赛要打铁,毕竟老远过 ...
- rancher2.0部署
1.安装前准备 #当前环境介绍 操作系统:CentOS7.3 硬件:2C 4G内存 官网要求Docker版本: 1.12.6 1.13.1 17.03.2 #关闭防火墙 systemctl stop ...
- Weblogic启动服务时候提示:Authentication for user weblogic denied
一.问题描述: 在Linux系统上对weblogic10.3.6搭建完成后,启动控制台没问题,但是新建的服务怎么都起不来,而且在服务的目录下也有了认证文件boot.properties文件,也确定用户 ...
- 7、JPA-映射-双向一对多
一个用户对应多个订单,多个订单对应一个用户,不管查哪一边都可以得到另一边的信息 实体类 Customer package com.jpa.yingshe; import javax.persisten ...
- WebService概念和使用
1.WebService到底是什么 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用 ...
- spring boot @Value Could not resolve placeholder
@Configuration public class PropertySourcePlaceholderConfig { @Bean public PropertySourcesPlaceholde ...