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使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
python实现批量修改文件名代码
Sep 10 Python
Python实现两款计算器功能示例
Dec 19 Python
详解Python中where()函数的用法
Mar 27 Python
python发送邮件脚本
May 22 Python
多个应用共存的Django配置方法
May 30 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
Window环境下Scrapy开发环境搭建
Nov 18 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
python语言中有算法吗
Jun 16 Python
python openCV自制绘画板
Oct 27 Python
浅谈Python numpy创建空数组的问题
May 25 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文件上传实例详解!!!
2007/01/02 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
<script defer> defer 是什么意思
2009/05/10 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
django输出html内容的实例
2018/05/27 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
李培根演讲稿
2014/05/22 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP
Python数据处理的三个实用技巧分享
2022/04/01 Python