Python day15装饰器基本理论,以及结合全局变量模拟session
装饰器(decorator):为其他函数添加附加功能
原则:1.不修改被修饰函数源代码
2.不修改被修饰函数的调用方式
装饰器=高阶函数+函数嵌套+闭包
import time
def timmer(func):
def wapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('函数运行时间是%s'%(stop_time-start_time))
return res
return wapper
@timmer
def cal(l):
start_time=time.time()
res=0
for i in l:
time.sleep(0.1)
res+=i
stop_time=time.time() cal(range(100))
上述代码是一个装饰器案例,可能看不懂,下面分成三部分进行讲解
1.高阶函数
接收一个函数或者返回一个函数都称为高阶函数
例如:
def foo():
print("你好") def test(func):
print(func)
func() test(foo)
2.函数中嵌套定义另一个函数,叫函数嵌套
3.嵌套函数各自封闭参数,叫做函数的闭包
装饰器的基本框架
def timmer(func):
def wrapper():
func()
return wrapper # 传入函数,返回嵌套函数
# 嵌套函数中传入原函数构成装饰器
这样在不改变源代码的情况下,能够增加或者修改原函数,下面在函数的上方用@timmer进行调用即可
将装饰器中传入*args可变参数和**kwargs可变关键字参数,即可做成万用的函数装饰器
例子2 制作验证装饰器
def auth_func(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
username=input('用户名:').rstrip()
password=input('密码:').rstrip()
if (username=='nnn' and password ==''):
res=func(*args,**kwargs)
return res
else:
return print('密码错误')
return wrapper @auth_func
def index():
print('欢迎来到京东') @auth_func
def home(name):
print('个人家园%s'%name) @auth_func
def shoppingcart(name):
print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜')) index()
home("littlepage's home")
shoppingcart('littlepage')
上方代码是一个验证装饰器,在函数前加上@可调用装饰器
再加上前面学习的全局变量,则可以模拟session
usr_dictionary={'username':None,'login':False}
def auth_func(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
username=input('用户名:').rstrip()
password=input('密码:').rstrip()
if usr_dictionary['username'] and usr_dictionary['login']:
res=func(*args,**kwargs)
if (username=='nnn' and password ==''):
res=func(*args,**kwargs)
return res
else:
return print('密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到京东')
@auth_func
def home(name):
print('个人家园%s'%name)
@auth_func
def shoppingcart(name):
print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜'))
index()
home("littlepage's home")
shoppingcart('littlepage')
Python day15装饰器基本理论,以及结合全局变量模拟session的更多相关文章
- python 深入浅出装饰器(decorator)--举的例子关于星级争霸2(starcraft2)
其实早就想写一篇深入浅出装饰器的文章,苦于一直没有找到很好的例子描述,自己除了在写api参数检测和日志打印的时候用到以外,其他地方也没有什么重度使用所以一直没有写. 我不会讲解装饰器的理论,还有各种基 ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
随机推荐
- 因子分析(Factor Analysis)
原文地址:http://www.cnblogs.com/jerrylead/archive/2011/05/11/2043317.html 1 问题 之前我们考虑的训练数据中样例的个数m都远远大于其特 ...
- 1.keras实现-->自己训练卷积模型实现猫狗二分类(CNN)
原数据集:包含 25000张猫狗图像,两个类别各有12500 新数据集:猫.狗 (照片大小不一样) 训练集:各1000个样本 验证集:各500个样本 测试集:各500个样本 1= 狗,0= 猫 # 将 ...
- ajax response 系统错误时responseText出现一堆代码
在后期维护webform的一个项目时遇到个比较大的坑,前台ajax请求,失败时弹出后台自定义的错误信息responsetext.结果在本地运行时能正常弹出“验证码错误”,而发布到服务器上respons ...
- 取n的某些位
实例十一:取n的某些位 方法:result=(n>>4)&(~(~0<<4)) 取出某数n的低4位. 数值0 0000 0000 ~0 1111 1111 ~0& ...
- Hive 大数据倾斜总结
在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...
- iPhone手机获取uuid 安装测试app
iPhone手机获取uuid 安装测试app UDID是一种iOS设备的特殊识别码.除序号之外,每台ios装置都另有一组独一无二的号码,我们就称之为识别码( Unique Device Identif ...
- 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。
使用CSS3纯代码来实现模拟时钟,及指针动画功能. 在这里主要使用到css3一些基本元素: border-radius:圆角边框,画圆形:表盘 Transform:变换,旋转,扭曲:刻度盘,指针形状 ...
- IDEA上传代码到码云
- mysql分类和事务回滚
主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗 ...
- 一个简单的JavaScript实例
1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...