python函数修饰符@的使用方法解析


Posted in Python onSeptember 02, 2019

python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志、性能测试、事务处理等等。

创建函数修饰符的规则:

(1)修饰符是一个函数

(2)修饰符取被修饰函数为参数

(3)修饰符返回一个新函数

(4)修饰符维护被维护函数的签名

例子1:被修饰函数不带参数

def log(func):
  def wrapper():
    print('log开始 ...')
    func()
    print('log结束 ...')
  return wrapper
@log
def test():
  print('test ..')
test()

运行结果:

log开始 ...
test ..
log结束 ...

例子2:使用functools模块提供的修改函数属性的方法wraps

def log(func):
  def wrapper():
    print('log开始 ...')
    func()
    print('log结束 ...')
  return wrapper
@log
def test1():
  print('test1 ..')

def test2():
  print('test2 ..')
print(test1.__name__)
print(test2.__name__)

运行结果:

wrapper
test2

可见test1的函数名称变了,如果某些代码用到就会出问题,可以使用functools模块提供的修改函数属性的方法wraps

from functools import wraps

def log(func):
  @wraps(func)
  def wrapper():
    print('log开始 ...')
    func()
    print('log结束 ...')
  return wrapper
@log
def test1():
  print('test1 ..')

def test2():
  print('test2 ..')

print(test1.__name__)
print(test2.__name__)

运行结果:

test1
test2

例子3:被修饰函数带参数

from functools import wraps
def log(func):
  @wraps(func)
  def wrapper(*args,**kwargs):
    print('log开始 ...',func.__name__)
    ret = func(*args,**kwargs)
    print('log结束 ...')
    return ret
  return wrapper
@log
def test1(s):
  print('test1 ..', s)
  return s

@log
def test2(s1, s2):
  print('test2 ..', s1, s2)
  return s1 + s2
test1('a')
test2('a','bc')

运行结果:

log开始 ... test1
test1 .. a
log结束 ...
log开始 ... test2
test2 .. a bc
log结束 ...

例子4:修饰符带参数,需要比上面例子多一层包装

from functools import wraps

def log(arg):  
  def _log(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
      print('log开始 ...',func.__name__, arg)      
      ret = func(*args,**kwargs)
      print('log结束 ...')
      return ret
    return wrapper
  return _log
 
@log('module1')
def test1(s):
  print('test1 ..', s)
  return s

@log('module1')
def test2(s1, s2):
  print('test2 ..', s1, s2)
  return s1 + s2
test1('a')
test2('a','bc')

运行结果:

log开始 ... test1 module1
test1 .. a
log结束 ...
log开始 ... test2 module1
test2 .. a bc
log结束 ...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中进行自动化单元测试的教程
Apr 15 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
python实现拓扑排序的基本教程
Mar 11 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
Flask实现跨域请求的处理方法
Sep 27 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python绘制BA无标度网络示例代码
Nov 21 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
python实现图像外边界跟踪操作
Jul 13 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 #Python
基于python进行抽样分布描述及实践详解
Sep 02 #Python
利用Python复制文件的9种方法总结
Sep 02 #Python
Python单元测试工具doctest和unittest使用解析
Sep 02 #Python
Python操作SQLite数据库过程解析
Sep 02 #Python
Python实现生成密码字典的方法示例
Sep 02 #Python
python使用多线程编写tcp客户端程序
Sep 02 #Python
You might like
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python Pandas 读取txt表格的实例
2018/04/29 Python
python实现名片管理系统
2018/11/29 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
Python hmac模块使用实例解析
2019/12/24 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
智能室内花园:Click & Grow
2021/01/29 全球购物
军训自我鉴定
2013/12/14 职场文书
药店主任岗位责任制
2014/02/10 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
资料员岗位职责范本
2015/04/13 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
2016年寒假见闻
2015/10/10 职场文书
网络研修随笔感言
2015/11/18 职场文书
js前端图片加载异常兜底方案
2022/06/21 Javascript