装饰器(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. 接口自动化测试框架搭建 – Java+TestNG 测试Restful service

    接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...

  2. html select 和dropdownlist小结收集

    //html select var x = $("#selectSort").val();  //获取选中的value值 获取select选中的索引: $("#selec ...

  3. Qt addStretch()详解

    addStretch函数,是在布局的时候用到. 函数原型: void QBoxLayout::addStretch ( int stretch = 0 ) 作用:平均分配Layout 比如: QVBo ...

  4. How to install MVVM Light Toolkit via NuGet

    Here is how you can install MVVM Light Toolkit  via NuGet in an easy way using only Visual Studio. S ...

  5. python3 集合的常用方法

    方法 意义 S.add(e) 在集合中添加一个新的元素e:如果元素已经存在,则不添加 S.remove(e) 从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误 S.dis ...

  6. jQuery ajax 请求HttpServlet返回[HTTP/1.1 405 Method not allowed]

    1.问题使用jQuery的ajax请求 Servlet 时,返回没有进入ajax的success回调函数,浏览器控制台显示 [HTTP/1.1 405 Method not allowed]. 2.解 ...

  7. 如何将TNJ的源代码添加到eclipse[转]

    java编程思想第四版中net.mindview.util的jar包导入 在Java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewi ...

  8. mysql 替换函数replace()实现mysql 替换字符串

    mysql 替换字符串的实现方法:mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Upd ...

  9. Kali更新deb源

    vim /etc/apt/sources.list #中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib ...

  10. Python3.x:抓取百事糗科段子

    Python3.x:抓取百事糗科段子 实现代码: #Python3.6 获取糗事百科的段子 import urllib.request #导入各类要用到的包 import urllib import ...