python装饰器

Python装饰器与闭包

狂风中的少年 提交于 2020-01-17 15:36:37
python装饰器利用了函数闭包和函数可以当做参数进行传递的特性,函数闭包指在一个函数中嵌套一个函数,同时外层函数返回内层函数 user = { "is_login": False } def edit_user(): print('用户名修改成功') def add_article(): print('添加文章成功') def login_required(func): def wrapper(): if user['is_login'] == True: func() else: print('跳转到登录页面') return wrapper login_required(edit_user)() login_required(add_article)() #利用语法糖可以简化调用 user = { "is_login": False } def login_required(func): def wrapper(): if user['is_login'] == True: func() else: print('跳转到登录页面') return wrapper @login_required def edit_user(): print('用户名修改成功') @login_required def add_article(): print('添加文章成功') #调用时,由于

从 0 学习 Python 0 - 50 大合集总结 Python技术

£可爱£侵袭症+ 提交于 2020-01-17 07:48:45
大家使用的时候找到对应的代码文件夹直接 Ctrl +B 在 IDK工具中就可以验证执行相应代码即可。以此提高学习效率。 另外学习结构体系中咱们还加入 LeetCode 面试系列好文,大家可以边学习基础知识,边了解面试及算法知识,这样后期系统学习下来对 Python 的使用会有事半功倍的效果。文章目录如下: 前 50 天基础文章目录: 第1天:Python 环境搭建 第2天:Python 基础语法 第3天:Python 变量与数据类型 第4天:Python 流程控制 第5天:Python函数 第6天:Python 模块和包 第7天:Python 数据结构--序列 第8天:Python List 第9天:Python tupple 第10天:Python 类与对象 第11天:Python 字典 第12天:Python 集合 第13天:Python 函数的参数 第14 天:Python 高阶函数 第15天:Python 输入输出 第16天:Python 错误和异常 第17天:Python 之引用 第18天:Python 之迭代器 第19天:Web 开发 Flask 介绍 第20天:Python 之装饰器 第21天:Web开发 Jinja2模板引擎 第22天:Python NameSpace & Scope 第23天:Python Standard Library 01 第24天

python--装饰器

妖精的绣舞 提交于 2020-01-15 16:02:27
python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能, 装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了。装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。 谈装饰器前,还要先要明白一件事,Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print("foo") def bar(func): func() bar(foo) 正式回到我们的主题。装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景

【翻译】深入浅出Python装饰器之基本用法

為{幸葍}努か 提交于 2020-01-15 15:57:15
深入浅出Python装饰器 前言 前两天被问到装饰器的概念,在我的理解里:装饰器就是一个函数,他的参数为函数,一般用来对参数进行一些额外的处理,但不影响参数函数的表现。 但说实话写的不多,于是就想查一下资料具体看一下。而前两天发现谷歌设置为中英文,搜索结果的排序都不一样。于是就翻了下英文的资料,看完之后感觉讲的的确不错,就诞生了想尝试翻译一下的想法,于是就有了本文。 老外讲东西太细了,所以有些显而易见的话会被我过滤掉……另外,高级用法暂时未翻。 本文翻译自 Primer on Python Decorators 的第一部分,深入浅出是个人翻译,Primer原义为入门读物,所以也可以翻译为Python装饰器入门指南。 翻译正文 目录 本文的结构如下: 函数 第一类对象(First-Class Objects) 内置函数 返回值为函数的函数 简单的装饰器 语法糖 一个重复使用的装饰器 带参数的装饰器函数 装饰器函数的返回值 你是谁啊?(函数名) 一些真实用例 计时函数 代码调试 减速/延迟执行的代码 插件注册 检查用户是否登陆的装饰器 华丽的装饰器/装饰器的高级用法 装饰类 多重装饰器 带参装饰器 多功能装饰器(带参不带参均可) 含有状态的装饰器 另外一些真实用例 减速/延迟执行的代码 单例模式的实现 缓存返回值 向单元里添加信息 验证JSON是否合理 总结 深入阅读 另:此文有配套

python 13---17

大兔子大兔子 提交于 2020-01-15 07:07:09
第十三章 一. 匿名函数 匿名函数 lambda,也叫一句话函数。 现在有一个需求:你们写一个函数,此函数接收两个int参数,返回和值。 def func(a,b): return a+b print(func(3,4)) 那么接下来我们用匿名函数完成上面的需求: func = lambda a,b: a+b print(func(3, 4)) # 7 我们分析一下上面的代码: 语法: 函数名 = lambda 参数:返回值 1)此函数不是没有名字,他是有名字的,他的名字就叫做lambda 2)lambda 是定义匿名函数的关键字,相当于函数的def. 3)lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。 func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs print(func(3, 4,c=666,name='alex')) # {'name': 'alex'} # 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。 4)返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。(但是想要返回多个元素要以容器的形式返回) 5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据 接下来做几个匿名函数的小题: 写匿名函数:接收一个可切片的数据

python的装饰器 --打印日志照片

主宰稳场 提交于 2020-01-15 06:35:24
要求 创建装饰器, 要求如下: 创建add_log装饰器, 被装饰的函数打印日志信息; 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx 编程 import time import functools def add_log ( func ) : @functools . wraps ( func ) def wrapper ( * args , * * kwargs ) : start_time = time . time ( ) res = func ( * args , * * kwargs ) end_time = time . time ( ) print ( '[%s] 函数名:%s,运行时间:%.6f,运行返回值的结果' ':%d' % ( time . ctime ( ) , func . __name__ , end_time - start_time , res ) ) return res return wrapper @add_log def add ( x , y ) : time . sleep ( 1 ) return x + y add ( 1 , 10 ) 结果 来源: CSDN 作者: 一坨小红花 链接: https://blog.csdn.net/qq_45652989/article/details

Python基础15-函数闭包与装饰器

你说的曾经没有我的故事 提交于 2020-01-15 05:00:40
目录 装饰器概念 装饰器的实现 修改被装饰函数的代码(非装饰器实现) 修改被装饰函数的调用方式(非装饰器实现) 装饰器的实现(不完整的实现level1) 装饰器实现的语法糖(不完整的实现level2) 函数闭包加上返回值和参数(基本完整的装饰器实现) 过渡内容 带参数的装饰器 装饰器概念 装饰器本质就是函数,功能是为其他函数添加附加功能。装饰器的原则如下 不修改被装饰函数的源代码 不修改被装饰函数的调用方式 装饰器的实现 要实现装饰器,就是遵循装饰器的原则来实现装饰器,具体做法就是 装饰器=高阶函数+函数嵌套/闭包。 我们用一个例子来实现以下功能。有个函数foo,执行时间较长,我们在不修改foo函数的源代码、不修改foo函数的调用方式的前提下,显示foo函数执行的时间。这个需求就用装饰器来实现,我们一点一点接近装饰器的完整实现。 import time def foo(): """ 模拟foo函数运行了3秒左右 :return: """ time.sleep(3) print('from foo') pass # foo函数的调用方式就是直接调用 foo() 修改被装饰函数的代码(非装饰器实现) 我们可以选择在foo函数开始执行的时候记下时间,在foo结束执行的时候再记下时间,从而得到foo函数的执行时间。但是这样就必须修改foo函数的源代码,这在大型项目里面很可能会引发连锁反应

python的装饰器顺序

一曲冷凌霜 提交于 2020-01-14 18:06:48
装饰顺序 :组装装饰器时,就近原则,从下往上装饰 执行顺序 :就远原则,从上往下调用 先进入离test函数最近的装饰器,由于装饰器中返回的是函数的函数名引用,并非真正的调用函数; 到inner2后,func会真正的执行函数,会调用inner1; 到inner1中,func会调用test函数; 再从各个函数出来 def wrapper_out1 ( func ) : # print('--out11---') def inner1 ( * args , * * kwargs ) : print ( '----in11----' ) res = func ( * args , * * kwargs ) print ( '----in12-----' ) return res # print('---out---12') return inner1 def wrapper_out2 ( func ) : # print('--out21---') def inner2 ( * args , * * kwargs ) : print ( '----in21----' ) res = func ( * args , * * kwargs ) print ( '----in22-----' ) return res # print('---out---22') return inner2

python的多个装饰器实现信息的登录

牧云@^-^@ 提交于 2020-01-14 08:00:31
要求 ['root','admin','redhat'] 1.user in [ ] 2.user+vip 编程 import functools import inspect login_session = [ 'root' , 'admin' , 'redhat' ] def is_login ( fun ) : @functools . wraps ( fun ) def warapper ( * args , * * kwargs ) : # ( 'root' , ) if args [ 0 ] in login_session : temp = fun ( * args , * * kwargs ) return temp else : print ( 'Error:%s 没哟登陆成功' % ( args [ 0 ] ) ) return warapper def is_admin ( fun ) : @functools . wraps ( fun ) # "" " # inspect.getcallargs会返回一个字典 # key:形参 # value:对应的实参 # "" " def wrapper ( * args , * * kwargs ) : inspect_res = inspect . getcallargs ( fun , * args , * *

python的装饰器 --练习题

假装没事ソ 提交于 2020-01-14 05:44:02
要求 编写装饰器required_ints, 条件如下: 1). 确保函数接收到的每一个参数都是整数; 2). 如果参数不是整形数, 打印 TypeError:参数必须为整形 编程 import functools def required_ints ( func ) : @functools . wraps ( func ) def wrapper ( * args , * * kwargs ) : # ( 1 , 2 , . . . . ) for i in args : # if isinstance(i,int): # pass # else : # print('函数所有的参数并非全是int型') if not isinstance ( i , int ) : print ( '函数所有的参数并非都是int型' ) break else : res = func ( * args , * * kwargs ) return res return wrapper @required_ints def add ( a , b ) : return a + b @required_ints def mymax ( a , b , c , d ) : return max ( a , b , c , d ) print ( add ( 1 , 2.0 ) ) 结果 来源: