装饰器(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的更多相关文章

  1. python 深入浅出装饰器(decorator)--举的例子关于星级争霸2(starcraft2)

    其实早就想写一篇深入浅出装饰器的文章,苦于一直没有找到很好的例子描述,自己除了在写api参数检测和日志打印的时候用到以外,其他地方也没有什么重度使用所以一直没有写. 我不会讲解装饰器的理论,还有各种基 ...

  2. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  3. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  4. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  5. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  6. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  7. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

  8. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  9. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

随机推荐

  1. [参考资料] 80个Python经典资料(教程+源码+工具)汇总

    AD : 2018重磅地面课程<机器读心术之语音识别前沿实战特训营>,迈向人工智能新高度 [专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/10 ...

  2. C#可扩展数组转变为String[]数组

    简单备忘: 由于需要将数据最终以逗号隔开来拼接,因而写了下面的处理方法. public void GetJoinString() { ArrayList arr = new ArrayList(); ...

  3. VS中出现“链接器工具错误,XXX工具模块对于SAFESEH映像是不安全的”的解决方法

    1.“调试”菜单->“属性”->“配置属性”->“链接器”->“命令行” 2.在“其它选项”的输入框里输入 /SAFESEH:NO ,点击“应用”

  4. SV中的线程

    SV中线程之间的通信可以让验证组件之间更好的传递transaction. SV对verilog建模方式的扩展:1) fork.....join 必须等到块内的所有线程都执行结束后,才能继续执行块后的语 ...

  5. jquery ui draggable,droppable 学习总结

    刚接触的时候,分不清draggable和droppable的区别,瞎弄了一会,其实很简单,draggable就是“拖”的功能,droppable就是“放”的功能. draggable()是被拖动的元素 ...

  6. 线程等待——CountDownLatch使用

    告警性能优化过程中,遇到如下问题:1. 在数据库计算几十万个实体的KPI值的方差:2. 计算结果进行表格化处理. 这里KPI包含多个Counter的数据库函数运算(比如Decode,AVG等函数),方 ...

  7. P1350 车的放置

    P1350 车的放置 设$f[i][j]$为当前推到第$i$列,该列高度$h$,已经放了$j$个车的方案数 则$f[i][j]=f[i-1][j]+f[i-1][j-1]*(h-j+1)$ 但是我们发 ...

  8. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

  9. 企业应用开发中最常用c++库

    log4cpp,http://log4cpp.sourceforge.net/,跟log4j一样,不说最重要,绝对是最常用的. zk 客户端,https://blog.csdn.net/yangzhe ...

  10. 查看 nodejs 安装包的相关指令

    npm -h 以上指令可以看到npm可用的指令 如果要卸载就用npm uninstall