通过一个任务来加深对装饰器的理解和应用

回顾:装饰器的框架

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小白学习之路(二十五)—【装饰器的应用】的更多相关文章

  1. Python小白学习之路(十五)—【map()函数】【filter()函数】【reduce()函数】

    一.map()函数 map()是 Python 内置的高阶函数 有两个参数,第一个是接收一个函数 f(匿名函数或者自定义函数都OK啦):第二个参数是一个 可迭代对象 功能是通过把函数 f 依次作用在 ...

  2. Python小白学习之路(十六)—【内置函数一】

    将68个内置函数按照其功能分为了10类,分别是: 数学运算(7个) abs()   divmod()  max()  min()  pow()  round()  sum() 类型转换(24个) bo ...

  3. Python小白学习之路(十二)—【前向引用】【风湿理论】

    前向引用 风湿理论(函数即变量) 理论总是很抽象,我个人理解: 代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识但是该函数体内具体是什么内容,这个时候并不着急去 ...

  4. Python小白学习之路(十)—【函数】【函数返回值】【函数参数】

    写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...

  5. Python小白学习之路(十九)—【文件操作步骤】【文件操作模式】

    一.文件操作步骤 step1:打开文件,得到文件句柄并赋值给一个变量step2:通过句柄对文件进行操作step3:关闭文件 举例: a = open('hello world', 'r', encod ...

  6. Python小白学习之路(十八)—【内置函数三】

    一.对象操作 help() 功能:返回目标对象的帮助信息 举例: print(help(input)) #执行结果 Help on built-in function input in module ...

  7. Python小白学习之路(十四)—【作用域】【匿名函数】【编程方法论】【高阶函数】

    吧啦吧啦内心戏 在没有具体学作用域之前,我在之前的学习笔记中就有提到 我开始以为是自己自创的词儿 没想到这个词早已经存在(手动捂脸) 真是个无知的小火锅(不知者无罪) 我发现自己最擅长做的事情,就是给 ...

  8. 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序

    一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...

  9. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  10. FastAPI 学习之路(十五)响应状态码

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

随机推荐

  1. Win7命令行编译cuda及设置Windows显卡响应时间

    在开始菜单中找到Visual Studio 2013 >> Visual Studio Tools 选择86或64版本的VC命令提示符环境,我用的 VS2013 x86 Native To ...

  2. GDI基础(2):绘制文本

    1.TextOut()和DrawText()函数 CDC::TextOut()在窗口的指定位置处输出文本,函数声明: virtual BOOL TextOut(int x, int y, LPCTST ...

  3. 安装了nodejs后在命令行运行npm报错:Error: Cannot find module 'internal/util/types'

    报错如下图所示: 解决方法:删除目录“C:\Users\wls\AppData\Roaming\npm\node_modules”下的npm文件夹

  4. WebVTT 及 HTML5 <track> 元素简介

    https://dev.opera.com/articles/zh-cn/an-introduction-to-webvtt-and-track/ 简介 网络视频文本轨道,简称为 WebVTT, 是一 ...

  5. VS2012智能感知变英文解决办法

    解决办法: 1.从一台没装.NET3.5的机子上复制C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\zh-CN路径下的文件覆盖就可以 2.或者重装中文版的f ...

  6. Windows API编程(一)完整的示范程序

    ## #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数; int APIEN ...

  7. (转)eclipse下配置tomcat7的几个重要问题,值得一看

    转自:http://jingyan.baidu.com/article/ab69b270ccc4792ca7189fd6.html 这段时间开始接触的servlet,今天尝试在eclipse下配置to ...

  8. MySQL连接查询(多表查询)

    基本含义 连接就是指两个或两个以上的表(数据源) “连接起来成为一个数据源”. 连接语法的基本形式:from 表1 [连接方式] join 表2 [on 连接条件]; 连接的结果可以当做一个“表”来使 ...

  9. noip第5课资料

  10. android sqlite 模糊查询

    正确的做法Cursor cursor = sd.rawQuery("select * from contect where QT_CUSTOM like ?", new Strin ...