python中装饰器(语法糖)概念
“”“”
什么是装饰器?
"""
还是通过一个例子来慢慢说明
先看下面的例子
def func_1(x):
return x*2
def fun_2(x):
return x*3
def fun_3(x, y i, j):
return x(i)+y(j)
r = func_3(func_1,func_2,2,3) #把函数引用作为参数传递给func_3
print(r)
#通过上面的例子明白:函数的参数可以是函数,也可以是一个类,其实可以是任何类型
def runtime_noargs():
pass
@runtime_noargs #这里就是一个装饰器,装饰器就是一个闭包函数,回忆下上篇文章的闭包感念
def function_demo1()
print("demo1函数被运行")
那么是如何把某种功能附加给上面的装饰器,让它帮助被装饰的函数实现某种功能的呢?
我们先对装饰器函数进行修改
import time
def runtime_noargs(function_name): #将来这里的function_name接受被装饰的函数名
def wrapper():
start_time = time.time()
function_name() #在这里执行被装饰器装饰的函数
end_time = time.time()
print(end_time - start_time)
return wrapper
@runtime_noargs #当装饰器用来装饰某函数时,被装饰的函数名被自动传参给装饰器函数
def function_demo1()
time.sleep(1)
print("demo1函数被运行")
function_demo1() #可以使用debug单步运行模式来看看函数的具体执行步骤
上面是一个没有参数的函数,通过装饰器来装饰的,那么有参数的函数如何通过装饰器来装饰呢?
def args_is_string(function_name):
def wrapper(a):
t=type(a)
if not isinstance(t(), str):
print("参数错误")
else:
funtion_name(a)
return wrapper
@args_is_string #通过一个装饰器函数来限制被装饰函数输入的参数只能是字符串
def function_demo2(args): #函数里的参数和装饰器函数里的内部函数wrapper参数对应,这样 print(args) #args参数就自动传给了装饰器中内部函数的参数a上,这是python的 #规则
function_demo2("aaaa")
上面的例子中,被装饰的函数只能传一个参数,那么要传多个参数呢?
通过一个例子来说明如何实现多个参数的函数的是如何被装饰的
def many_args(function_name):
def wrapper(*args):
print(*args) #不定长参数这里一个*,打印时需要
function_name(*args)
return wrapper
@many_args
def function_demo3(*args) #*args可以接受不定长参数,可以接受若干个参数
print(*args)
function_demo3(1,2,3,4,5,6)
如果关键字参数这种怎么办呢?
def dict_args(funtion_name):
def wrapper(**kwargs):
print(kwargs) #不定长字典类型的参数,两个*,在打印时不需要加*,注意和上面的区别
function_name(**kwargs)
return wrapper
@dict_args
def function_demo4(**kwargs): #**kwargs用来传不定长的字典形式参数
print(kwargs)
funtion_demo4(name = "fang", age = 10, address = "北京")
如果是混合型的参数呢?
def combo_args(function_name):
def wrapper(*args, **kwargs):
print(*args,kwargs)
return warpper
@combo_args
def function_demo5(*args, **kwargs):
pass
function_demo5(1,2,name="fang",age = "10",address="北京")
上面是装饰器的基本使用方法。
再介绍一种进阶版的装饰器,监控函数运行是否超时
def max_runtime(function_time);
def out_wrapper(funtion_name):
def wrapper(*args, **kwargs):
start_time = time.time()
i = function_name(*args,**kwargs) #如果函数需要返回值,这里必须由接住函数 #返回值
end_time = time.time()
use_time = end_time - start_time
if use_time > timeout:
raise RuntimeError("函数运行超时")
return i #这里必须把函数返回值返回去,即便在被装饰的函数本体里已经写了 #return
return wrapper
return out_wrapper
@max_runtime(timeout=1)
def function_demo6(*args, **kwargs):
time.sleep(2)
print("demo6运行")
return 1
result = function_demo6()
print(result)
上面的这个例子告诉我们,装饰器后面带参数时,装饰器的闭包函数体就要多写一层函数,见上图之间的对应关系。
python中装饰器(语法糖)概念的更多相关文章
- python中装饰器的原理以及实现,
python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...
- 8.Python中装饰器是什么?
Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...
- python装饰器 语法糖
简介: 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数. 比如说我们写flask,路由就是用装饰器定义的.如果写权限控制,那么权限控制一般也是 ...
- Python中装饰器(转)
本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...
- Python核心技术与实战——十四|Python中装饰器的使用
我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...
- Python中装饰器的用法
定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...
- python中装饰器修复技术
python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...
- python中装饰器的执行细节
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
- python中装饰器的原理
装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕 def outer(func): def inner(): print(" ...
随机推荐
- 【转帖】sysbench的安装和做性能测试
iMySQL | 老叶茶馆 sysbench的安装和做性能测试 http://imysql.cn/node/312 我仿照这个学的 但是 需要用更新的版本才可以. By yejr on 14 六月 ...
- Oracle对象-视图和索引
Oracle 对象-视图 视图概念 视图就是提供一个查询的窗口,所有的数据来自于原表 创建视图[必须有dba权限] --查询语句创建表 create table emp as select * f ...
- Android Studio彻底删除Module
在"Project"视图中选择需要删除的module名,此处删除"app",点击右键,选择"Open Module Setting",然后选 ...
- centos7 宝塔php7安装mongodb扩展
一.下载.解压源码 下载地址:https://pecl.php.net/package/mongodb wget -c https://pecl.php.net/get/mongodb-1.5.3.t ...
- spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目
spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09
- Oracle设置权限和还原数据库
Oracle还原数据库 ,在最高权限账户上,先将安装好的数据上创建一个账户 -- Create the user create user newsafe identified by newsafe d ...
- sqlserver跨库操作数据
垮库只能读操作,写操作需要设置权限. USE [jdddb] GO /****** Object: StoredProcedure [dbo].[proc_LYOrderCancel] Script ...
- vi学习笔记
dd 删除一行 de删除光标后面的单词 o向下插入一行 O向上插入一行 y复制 yy复制一行 ye复制光标后面的单词 p粘贴 == 代码自动布局 批量注释 ctrl + v , 输入大写I, 选 ...
- npm install 报错踩坑路
先出现的是超过最大调用栈问题: npm ERR! Maximum call stack size exceeded 百度之后说给npm降级或者升级 降级 : npm install -g npm@5. ...
- php 限制标题长度,将一个中文转换成一个字符
点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...