python三层装饰器-python3装饰器
python装饰器
预备知识
首先我们要知道在python,一切皆对象,函数也是一个对象
>>> def test():
... return "Hello World"
有自己的id值,有type,有自己的值
>>> id(test)
140155005410568
>>> type(test)
>>> test
甚至可以赋值给其他变量
>>> test1 = test
>>> test1()
'Hello World'
哪怕是当做参数传递给别的函数,也可以当做函数的返回值
>>> def foo(func):
... print(func)
... return func
...
>>> test2 = foo(test)
>>> test2()
'Hello World'
装饰器定义
装饰器本质其实就是一个函数, 可以让其它函数不改动源代码的情况下增加其他新功能, 比如网站经常需要的权限校验等场景
最初的函数
def add(x, y):
print(x+y)
add(1,2)
现在我们有一个新需求, 计算代码执行时间
import time
def add(x, y):
start_time = time.time
print(x+y)
stop_time = time.time
print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))
add(1,2)
我们当然可以这么写, 但是一来修改了源代码可能会造成一些未知的错误, 二来如果我们有一百个函数, 这样写也不现实, 这就是我们装饰器出场的时候了.
创建一个装饰器
import time
def timmer(func):
"""
:param func: 被装饰的函数
:return: 一个计算函数运行时间的函数
"""
def wrapper(*args, **kwargs):
"""
:param args:收集被装饰函数的参数
:param kwargs:收集被装饰函数的关键字参数
:return:
"""
start_time = time.time()
# 让进程睡一秒
time.sleep(1)
# 调用被装饰的函数
result = func(*args, **kwargs)
stop_time = time.time()
print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))
return result
return wrapper
使用装饰器
def add(x, y):
print(x,y)
# 因为timmer返回的是wrapper函数对象,所以执行add()相当于执行wrapper()
add = timmer(add)
add(1,2)
如果觉得还是麻烦那就通过一个语法糖@符号来使用装饰器
@timmer
def add(x, y):
print(x,y)
add(1,2)
这就是最基本的装饰器, 在不修改源代码的前提下为函数添加一个新功能, 调用时只需要在原函数上方添加一个 @deco_name , 在这里是@timmer
带参数的装饰器
python还允许我们给装饰器带上函数
import time
def timmer(flag):
"""
:param flag: 接收装饰器的参数
:return:
"""
def outer_wrapper(func):
"""
:param func: 接收被装饰的函数
:return:
"""
# 接收被装饰函数的参数
def wrapper(*args, **kwargs):
"""
:param args: 收集被装饰函数的参数
:param kwargs: 收集被装饰函数的关键字参数
:return:
"""
if flag == "true":
start_time = time.time()
# 调用被装饰的函数
result = func(*args, **kwargs)
# 让进程睡一秒
time.sleep(1)
stop_time = time.time()
print("{func} spend {time} ".format(func="add", time=stop_time - start_time))
return result
else:
print("Unexpected ending")
return wrapper
return outer_wrapper
通过一个语法糖@符号来使用装饰器
所谓的语法糖便是你不使用也可以完成任务,但是使用它可以让你的代码更简洁
@timmer(flag="false")
def add(x, y):
print(x, y)
add(1,2)
被多个装饰器装饰
当函数被多个装饰器装饰时,从里向外装饰
@a
@b
@c
def func():
pass
相当于
func = a(b(c(func)))
python三层装饰器-python3装饰器相关推荐
- python三层装饰器-python三大神器===》装饰器
1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...
- python三层装饰器-Python自动化开发学习4-装饰器
装饰器 通过装饰器可以为函数添加附加功能.通过修改函数本身也可以实现增加功能,但是通过装饰器还有下面2个好处.装饰器的2个原则:不改变被装饰函数的源代码 不改变被装饰函数的调用方式 遵循了上面2个原则 ...
- 装饰器python3菜鸟教程_认识Python装饰器
Python中的装饰器用来给Python中的函数添加一些辅助功能.比如我们可以把[输出日志]这个辅助功能写到一个装饰器里.只要我们在某个函数A之前添加了这个[输出日志]的装饰器,那么执行函数A的时候, ...
- python教程:类的装饰器方法、特殊成员方法
装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...
- python重写和装饰器_python装饰器
python装饰器的本质,就是闭包! 我们一般谈Python的闭包,都是指普通的入参,而谈装饰器的时候,入参一定有函数!闭包和装饰器,返回的都是函数.函数是代码的最小封装单位,装饰器作用于函数,它不影 ...
- Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景
1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...
- Python的神奇功能——函数装饰器MetaClass
Python中的装饰器,会让很多人望而却步.不要被它吓跑,啃下它,其实超有用,也没有想象中难. 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改. Python的装饰 ...
- python描述器做权限控制_Python装饰器14-描述器
描述器 这是Python一个重要的概念,英文名:Descriptor descriptor是对象的一个属性,只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一 ...
- Python 进阶_闭包 amp; 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
最新文章
- idea 关于spring boot实现自动编译
- Cannot connect to the Docker daemon. Is the docker daemon running on this host?
- BZOJ 1014 火星人prefix
- Node.js Electron的扩展模块
- 济南市软件测试工程师的工资水平,软件测试工程师工资怎么样?高吗?
- 常用公有云接入——亚马逊
- 获取客户端ip_代理IP工具能否解决反爬?
- zabbix 安装_安装zabbix
- Scrapy+eChart自动爬取生成网络安全词云
- 更适合Pythoner的标记语言Yaml学习总结
- ss命令,显示socket状态
- 【密码学05】加密模式
- CodeForces - 837F(二分组合思维)
- STM32——电容触摸按键实验
- 无需密码自己卸载深信服EDR软件
- 对话现实版“谢耳朵”:多重宇宙和引力、超弦理论、暗能量
- Java语言基础03-标识符、关键字、字面值、变量、数据类型
- Excel怎么设置每页都打印标题行?
- Android开发学习总结(一)——搭建最新版本的Android开发环境
- 下载的caj论文怎么转换成pdf?
热门文章
- vmare安装ghostwin7
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- [转]Erwin4.1.4与PowerDesign9.5
- 有关sql server 2000的数据类型
- 多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
- ItChat与图灵机器人的结合
- 修改jar中的class文件
- 上传头像,layui上传图片
- 数据库SQL的分组函数
- char[]数组与char *指针的区别