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脚本实现DNSPod DNS动态解析域名
Feb 14 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python3多线程操作简单示例
May 22 Python
PHP实现发送和接收JSON请求
Jun 07 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
Django框架实现的分页demo示例
May 25 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
Django单元测试工具test client使用详解
Aug 02 Python
Pytorch mask_select 函数的用法详解
Feb 18 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面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python中几个比较常见的名词解释
2015/07/04 Python
Python性能提升之延迟初始化
2016/12/04 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python中存取文件的4种不同操作
2018/07/02 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
行政文秘岗位职责范本
2014/02/10 职场文书
农村文化活动总结
2014/08/28 职场文书
个人务虚会发言材料
2014/10/20 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技