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 ...
随机推荐
- shell应用技巧
Shell 应用技巧 Shell是一个命令解释器,是在内核之上和内核交互的一个层面. Shell有很多种,我们所使用的的带提示符的那种属于/bin/bash,几乎所有的linux系统缺省就是这种she ...
- js随机点名系统
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Leetcode: Construct Binary Tree from Preorder and Inorder Transversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...
- 【页面加速】配置Nginx加载ngx_pagespeed模块,加快网站打开的速度
ngx_pagespeed 是一个 Nginx 的扩展模块,可以加速你的网站,减少页面加载时间,它会自动将一些提升web性能的实践应用到网页和相关的资源(CSS.JS和图片)上,无需你修改内容和流程. ...
- swoole线程和进程
pstree -a | grep php | | `-php server.php 主进程 | | |-php server.php 管理线程 ...
- Verilog篇(四)时序模型
时序模型:仿真器的时间推进模型,它反映了推进仿真时间和调度事件的方式. 1)门级时序模型:适用于分析所有的连续赋值语句,过程连续赋值语句,门级原语,用户自定义原语. 特点:任意时刻,任意输入变化都将重 ...
- cf463d
这题说的是给了k个串算出这k个串的最长公共子序列,这k个串每个串都是由1--n的数字组成的. 将第一串的数字按照顺序重新编号为123...n 然后后面的串按照这个编号重新标号,就转化为下面每个串大最长 ...
- python webdriver 显示等待判断元素是可以被点击的,但是执行脚本时,却提示元素不能点击的解决办法?
我之前运行没问题的环境是firefox版本50,对应的驱动是没有问题的,现在firefox自动升级到了60,驱动没有变,我试着把浏览器装回了50,再试就好了, 所以应该是浏览器跟驱动geckodriv ...
- Linux服务器---安装apache
Apache安装 1.安装Apache,使用命令“yum install httpd -y” [root@localhost ~]# yum install httpd -y Loaded pl ...
- Python Web学习笔记之socket编程
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...