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 相关文章推荐
简单解析Django框架中的表单验证
Jul 17 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
python编写分类决策树的代码
Dec 21 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
python实时监控logstash日志代码
Apr 27 Python
python如何求100以内的素数
May 27 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
python 如何区分return和yield
Sep 22 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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数组应该有多大的分析
2009/07/30 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
php 基础函数
2017/02/10 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
Vue实现简易计算器
2020/02/25 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
学生信息管理系统python版
2018/10/17 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
python中xlrd模块的使用详解
2021/02/01 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
人事部主管岗位职责
2013/12/26 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2014年环保局工作总结
2014/12/11 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL