python中的装饰器有哪些-python中的装饰器
python的装饰器是用来装饰函数的。这是什么意思呢?假如我们有一个函数,这个函数的功能不能满足我们现有的需求,那么我们可以通过装饰器在这个函数执行前执行后做一些我们需要的操作(如果函数本身功能不满足,那就直接修改方法体了,不需要装饰器帮忙)。
1. 简单装饰器
装饰器的语法糖是使用@符号表示,装饰器本身也是一个函数,只不过参数是函数而已。
def decor_function(func):
def wrapper_function():
print("[%s] %s() called" % (ctime(), func.__name__))
return func()
return wrapper_function
@decor_function
def my_func():
print("Hello world")
...
my_func()
decor_function也就是我们的装饰器函数,它对原有的函数进行包装,返回一个包装过的函数wrapper_function。使用@修饰过的函数my_func,返回的函数实际上是装饰器返回的函数wrapper_function.
[Mon Jul 9 17:07:40 2018] my_func() called
Hello world
2. 修饰含有参数的函数
函数定义可以使用任意的参数,那么装饰器函数如何处理呢?其实很简单,使用*args和**kargs就可以方便的调用了,只需要在装饰器函数的返回的函数中将参数传递给被修饰的函数就可以了。
def decor_function(func):
def wrapper_function(*args, **kargs):
print("[%s] %s() called" % (ctime(), func.__name__))
return func(*args, **kargs)
return wrapper_function
@decor_function
def my_func_with_param(name):
print("Hello", name)
my_func_with_param("Joe")
[Mon Jul 9 17:12:58 2018] my_func_with_param() called
Hello Joe
3. 装饰函数带参数
装饰器函数本身也是可以带参数的,使用参数,可以根据具体的场景添加不同的功能实现。
def decor_function_with_parm(level):
if level == "info":
logging.info("info message logged")
elif level == "error":
logging.error("error message logged")
else:
logging.debug("debug message logged")
def wrapper_outter_func(func):
def wrapper_inner_func(*args, **kargs):
func(*args, **kargs)
return wrapper_inner_func
return wrapper_outter_func
@decor_function_with_parm(level="info")
def my_func2(name):
print("Hello,", name)
my_func2("Joe")
带参数的装饰器函数写起来比较麻烦,因为需要处理的参数比较多,一般最外层的函数处理装饰器参数,接下来的函数处理func,最后一层函数用来处理被修饰的函数的参数。
4. 多重修饰
一个函数可以被多个装饰器修饰,like this
@decor_function_with_parm(level="info")
@decor_function
def my_func():
print("Hello world")
执行的顺序是:
f = decor_function_with_parm(level='info', decor_function(my_func()))
5.使用类来处理
类的__call__()方法可以把类当成函数来处理,所以类也可以用做装饰器
class Decor:
def __init__(self, func):
print("__init__ method called")
self.func = func
def __call__(self, *args, **kargs):
print("__call__ method called")
self.func(*args, **kargs)
@Decor
def func(name):
print("func called")
print("Hello,",name)
func("joe")
使用类做装饰器时,init函数中添加被修饰函数的引用,在call函数中处理参数。
__init__ method called
__call__ method called
func called
Hello, joe
6.保留函数的元信息
被修饰之后的函数,它的元信息都消失,被替换的wrapper函数代替。python中提供了functools.wraps来保存函数的元信息。wraps本身也是个装饰器
def decor_function(func):
@wraps(func)
def wrapper_function(*args, **kargs):
print("[%s] %s() called" % (ctime(), func.__name__))
print(func.__name__)
return func(*args, **kargs)
return wrapper_function
@decor_function
def my_func_with_param(name):
print("Hello", name)
my_func_with_param('joe')
print(my_func_with_param.__name__)
[Mon Jul 9 18:16:11 2018] my_func_with_param() called
my_func_with_param
Hello joe
my_func_with_param
python中的装饰器有哪些-python中的装饰器相关推荐
- python中的装饰器有哪些-python 装饰器以及开发中常用的例子
有时候我们想为多个函数,同意添加某一种功能,比如及时统计,记录日志,缓存运算结果等等,而又不想改变函数代码 那就定义装饰器函数,用它来生成一个在原函数基础添加了新功能的函数,代替原函数 参考金角大王的 ...
- python装饰器实例-基于Python 装饰器装饰类中的方法实例
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解
我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...
- python类装饰器详解-python 中的装饰器详解
装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...
- python装饰器作用-理解python中的装饰器
一 什么是装饰器? 正如其名,装饰器的作用是为已经存在的对象增加额外功能(装饰),由此可使已有函数在无需代码改动的情况下增加额外功能:装饰器的本质是嵌套的函数且返回函数对象,即闭包.有关闭包的概念,可 ...
- python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...
本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...
- python两个装饰器执行顺序_python中多个装饰器的执行顺序详解
装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...
- python装饰器的顺序_python中多个装饰器的执行顺序详解
装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...
- Python 装饰器详解(中)
Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...
- python装饰器的顺序_python中装饰器的装饰顺序和执行顺序
在python语言中"装饰器"模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用'@'符号加装饰器名就能达到目的.但如果同一个目标函数需要进行多次装饰 ...
最新文章
- js 获取字符串中的中文
- dbproviderfactories.getfactory mysql_asp.net下使用DbProviderFactories的数据库操作类
- 别把项目成功当目标 (转)
- 关于spring集成junit4测试步骤
- 聊聊调度框架,K8S、Mesos、Swarm 一个都不能少
- 管理感悟:每次争吵后要有进步
- android的天气和时钟部件,时钟天气小部件
- .NET 常用ORM之SubSonic
- 多个fbx文件怎么合并_【Houdini】批量导入ABC和FBX文件mergeHips文件(搬运)
- 怎样让Windows10系统的时间显示到秒——且可手动修改系统的时间
- 第一次python作业(快递价格计算、个人所得税计算、模拟银行存取款)
- Matplotlib风羽自定义
- Milvus 揭秘| 向量索引算法HNSW和NSG的比较
- 《C程序设计》谭浩强
- 字节跳动2018校招前端面试题
- 文档在线编辑开发心得
- Spark Bloom Filter 测试
- 物联网通信_闲聊协议
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形
- 给android手机划代
热门文章
- jQuery 效果 - 滑动
- jni头文件自动生成
- Leetcode::Balanced Binary Tree
- ASCII码转换成特殊字符
- MySQL DDL--MySQL 5.7版本Online DDL操作
- 《图解HTTP》读书笔记(四:HTTP方法)
- 奇偶交错排列(DFS)
- Sql Server函数全解(二)数学函数
- 用于在公网环境下测试的Telnet/SSH服务器
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题...