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 ...
随机推荐
- 使用gunicorn部署Flask项目
[*] 本文出处:http://b1u3buf4.xyz/ [*] 本文作者:B1u3Buf4 [*] 本文授权:禁止转载 从自己的博客移动过来. gunicorn是一个python Wsgi的WEB ...
- js数组之有已有数组创建新的数组
concat()和splice()方法允许通过已经有的数组创建新的数组 concat()这个方法可以合并多个数组创建一个数组 splice()这个方法是获得截取一个数组中的子集创建一个新的数组. 理论 ...
- mysql进程文件
- Python中type的用法
目录 描述 语法 用法 type和isinstance Type和Object 描述 python的 type 函数有两个用法,当只有一个参数的时候,返回对象的类型.当有三个参数的时候返回一个类对象. ...
- 打造高可靠与高性能的React同构解决方案
前言 随着React的兴起, 结合Node直出的性能优势和React的组件化,React同构已然成为趋势之一.享受技术福利的同时,直面技术挑战,在复杂场景下,挑战10倍以上极致的性能优化. 什么是同构 ...
- Oracle查询session连接数和inactive以及 概要文件IDLE_TIME限制用户最大空闲连接时间
-----############oracle会话和进程################----------------查询会话总数select count(*) from v$session;--查 ...
- python的time时间模块
模块概述 1.一个.py文件就是一个模块 2.通过import语句在一个模块中导入另一个模块,import sys,print (sys.path),sys.path的结果为一个列表,列表的第一个元素 ...
- 20145318《网络对抗》MSF基础应用
20145318 <网络对抗> MSF基础应用 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067;(2)一 ...
- 20145336 张子扬 《网络对抗技术》 web安全基础实践
2014536 张子扬<网络攻防>Exp9 Web安全基础实践 实验准备 开启webgoat 1)开启webgoat,打开WebGoat: java -jar webgoat-contai ...
- 2018-2019-1 20189218《Linux内核原理与分析》第九周作业
进程调度的时机 进程调度时机就是内核调用schedule函数的时机.当内核即将返回用户空间时,内核会检查need_resched标志是否设置.如果设置,则调用schedule函数,此时是从中断(或者异 ...