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使用7z解压软件备份文件脚本分享
Feb 21 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
整理Python中的赋值运算符
May 13 Python
python使用folium库绘制地图点击框
Sep 21 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
python、Matlab求定积分的实现
Nov 20 Python
Python数据可视化:泊松分布详解
Dec 07 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
python之随机数函数的实现示例
Dec 30 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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使用Redis存储session时的一个Warning定位
2017/07/05 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
JS装饰器函数用法总结
2018/04/21 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
python字符串Intern机制详解
2019/07/01 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
python文件和文件夹复制函数
2020/02/07 Python
python定义类的简单用法
2020/07/24 Python
Python读写压缩文件的方法
2020/07/30 Python
python 5个实用的技巧
2020/09/27 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
超市业务员岗位职责
2013/12/05 职场文书
趣味运动会活动方案
2014/02/12 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
党员批评与自我批评
2014/10/15 职场文书
2015年教务工作总结
2015/05/23 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL