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

回顾:装饰器的框架

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. my.ini优化mysql数据库性能的十个参数(推荐)

    (1).max_connections:允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. ...

  2. BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)

    4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1067  Solved: 494[Submit][Status][Disc ...

  3. Java学习第1天:序言,基础及配置tomcat

    所谓是福不是祸,是祸躲不过,到底还是回到java的阵地上来.既然它这么热,那就学学它,现在这件事已经提上议事日程,也已经开始. 今天做的事: 泛泛的翻了几本书,敲了一些练习代码,比如字符串操作,接口等 ...

  4. 树形控件(CTreeCtrl和CTreeView)

    如何插入数据项目? 如何添加鼠标右击事件? 插入数据项 通过InsertItem()方法,有四种重载样式: HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsert ...

  5. Warning the user/local/mysql/data directory is not owned by the mysql user

    sudo chown -RL root:mysql /usr/local/mysql sudo chown -RL mysql:mysql /usr/local/mysql/data sudo /us ...

  6. TCP、UDP网络通信

    IP地址和端口号 端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用, 用户的普通应用程序需要使用1024以上的端口 ...

  7. spring的bean在什么时候被实例化

    Spring什么时候实例化bean,首先要分2种情况   第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化   第二:如 ...

  8. 分形之希尔伯特-皮亚诺(Hilbert-Peano)曲线

    1890年,意大利数学家皮亚诺(Peano G)发明能填满一个正方形的曲线,叫做皮亚诺曲线.后来,由希尔伯特作出了这条曲线,又名希尔伯特曲线.Hilbert-Peano曲线是一种分形图形,它可以画得无 ...

  9. Django:model中的ForeignKey理解

    有两个数据模型栏目模型和文章模型ArticleColumn和ArticlePost ArticleColumn: class ArticleColumn(models.Model): # 用户与栏目是 ...

  10. make编译

    Makefile 值得一提的是,在Makefile中的命令,必须要以[Tab]键开始. 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了 ...