Python小白学习之路(二十五)—【装饰器的应用】
通过一个任务来加深对装饰器的理解和应用
回顾:装饰器的框架
def timmer(func):
def wrapper():
func()
return wrapper
任务:给以下正在运行的程序加一个验证功能的装饰器正在运行的程序加一个验证功能的装饰器
def index():
print('欢迎来到京东主页') def home(name):
print('欢迎回家%s' %name) def shopping_car(name):
print('%购物车里有[%s,%s,%s]' %(name,'奶茶','蛋糕','娃娃'))
Step1:(初步实现一个人验证功能)
def check(func):
def wrapper(*args,**kwargs):
username = input('请输入用户名==>').strip()
passwd = input('请输入密码==>').strip()
if username == 'xhg' and passwd == '':
res = func(*args,**kwargs)
return res
else:
print('用户名或者密码错误,请重新登录')
return wrapper
@check
def index():
print('欢迎来到京东主页')
@check
def home(name):
print('欢迎回家%s' %name)
@check
def shopping_car(name):
print('%s购物车里有[%s,%s,%s]' %(name,'奶茶','蛋糕','娃娃')) index()
home('xhg')
shopping_car('xhg')
#上述程序可以实现基本功能
#缺点:每次执行一个函数时,均需要重新登录。
继续优化
Step2:(实现单个人在登录状态下验证一次)
current_user = {'username': None, 'passwd':False }
def check(func):
def wrapper(*args,**kwargs):
if current_user['username'] and current_user['passwd']:
res = func(*args, **kwargs)
return res
username = input('请输入用户名==>').strip()
passwd = input('请输入密码==>').strip()
if username =='xhg' and passwd == '':
current_user['username'] = username
current_user['passwd'] = True
res = func(*args,**kwargs)
return res
else:
print('用户名或者密码错误,请重新登录')
return wrapper
@check
def index():
print('欢迎来到京东主页')
@check
def home(name):
print('欢迎回家%s' %name)
@check
def shopping_car(name):
print('%s购物车里有[%s,%s,%s]' %(name,'奶茶','蛋糕','娃娃')) index()
home('xhg')
shopping_car('xhg')
#缺点:显示生活中并不可能只有一个用户,要考虑多个用户的情况
继续优化
step3:(登录状态与数据库进行匹配,并在登录状态下验证一次)
user_list=[
{'name':'a','passwd':''},
{'name':'b','passwd':''},
{'name':'c','passwd':''},
{'name':'d','passwd':''},
]
current_user = {'username': None, 'login': False}
def check(func):
def wrapper(*args,**kwargs):
if current_user['username'] and current_user['login']:
res = func(*args,**kwargs)
return res
username = input('请输入用户名==>').strip()
passwd = input('请输入密码==>').strip()
for user in user_list:
if username == user['name'] and passwd == user['passwd']:
current_user['username'] = username
current_user['login'] = True
res = func(*args,**kwargs)
return res
else:
print('用户名或者密码输入错误,请重新输入')
return wrapper
@check
def index():
print('欢迎来到京东主页')
@check
def home(name):
print('欢迎回家%s'%name)
@check
def shopping_car(name):
print('%s购物车里有[%s,%s,%s]'%(name, '奶茶', '蛋糕', '娃娃'))
index()
home(current_user['username'])
shopping_car(current_user['username'])
#感想:
当拿到一个要求,不要急于一下子写出完美的程序。要不断去思考、去联想、去调试。去想象还有什么需要完善的地方
自己还是练得少
以后要多加练习
Python小白学习之路(二十五)—【装饰器的应用】的更多相关文章
- Python小白学习之路(十五)—【map()函数】【filter()函数】【reduce()函数】
一.map()函数 map()是 Python 内置的高阶函数 有两个参数,第一个是接收一个函数 f(匿名函数或者自定义函数都OK啦):第二个参数是一个 可迭代对象 功能是通过把函数 f 依次作用在 ...
- Python小白学习之路(十六)—【内置函数一】
将68个内置函数按照其功能分为了10类,分别是: 数学运算(7个) abs() divmod() max() min() pow() round() sum() 类型转换(24个) bo ...
- Python小白学习之路(十二)—【前向引用】【风湿理论】
前向引用 风湿理论(函数即变量) 理论总是很抽象,我个人理解: 代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识但是该函数体内具体是什么内容,这个时候并不着急去 ...
- Python小白学习之路(十)—【函数】【函数返回值】【函数参数】
写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...
- Python小白学习之路(十九)—【文件操作步骤】【文件操作模式】
一.文件操作步骤 step1:打开文件,得到文件句柄并赋值给一个变量step2:通过句柄对文件进行操作step3:关闭文件 举例: a = open('hello world', 'r', encod ...
- Python小白学习之路(十八)—【内置函数三】
一.对象操作 help() 功能:返回目标对象的帮助信息 举例: print(help(input)) #执行结果 Help on built-in function input in module ...
- Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】
吧啦吧啦内心戏 在没有具体学作用域之前,我在之前的学习笔记中就有提到 我开始以为是自己自创的词儿 没想到这个词早已经存在(手动捂脸) 真是个无知的小火锅(不知者无罪) 我发现自己最擅长做的事情,就是给 ...
- 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序
一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...
- C#学习基础概念二十五问
C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...
- FastAPI 学习之路(十五)响应状态码
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
随机推荐
- Github 快速上手实战教程
一.实验介绍 1.1 实验内容 本次课程讲的是在实验楼的在线环境中,如何使用 Github 去管理在在线环境中使用的代码.配置.资源等实验相关文件,怎样去添加.同步和下拉在远程仓库中的实验文件,以此来 ...
- 对SVC和SVR的理解
首先: support vector classify(SVC)支持分类机做二分类的,找出分类面,解决分类问题 support vector regression(SCR)支持回归机做曲线拟合.函数回 ...
- layer.alert没有垂直居中
经查找是因为 <!DOCTYPE html> 这句没有写在整个页面的最顶部,将其放在整个页面的第一行就可以了. ps:原理不是很清楚
- 执行sh脚本文件下载Github上的代码(雷霄骅的ffmpeg示例代码)
今天想重新学习下ffmpeg,于是又来到了雷晓骅的博客,先下载了他的所有代码,这里记录一下在Windows上使用sh脚本下载GitHub上代码的过程. CygWin(最后并没有用到) 可以 ...
- poj-3667(线段树区间合并)
题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...
- vue 开发系列(六) 企业微信整合
概述 手机端程序可以和企业微信进行整合,我们也可以使用企业微信JSSDK功能,实现一些原生的功能. 整合步骤 在整合之前需要阅读 整合步骤. http://work.weixin.qq.com/api ...
- Multiplexer
definition a device that selects one of several analog or digital input signals and forwards the se ...
- s5-1 CPU调度
基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...
- mysql学习之路_连接查询
回顾 列属性:主键,自增长,唯一键. 关系:一对一,一对多,多对多 三层范式: 1NF:字段设计必须符合原子性 2NF:不存在部分依赖(没有复合主键) 3NF:不存在传递依赖(实体单独成表) 逆规范化 ...
- 20155205 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155205 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一:打开mac下的 ...