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的微信聊天机器人示例代码
Mar 03 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
python实现最速下降法
Mar 24 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
python 爬取B站原视频的实例代码
Sep 09 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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+DBM的同学录程序(1)
2006/10/09 PHP
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
小谈php正则提取图片地址
2014/03/27 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
js实现漫天星星效果
2017/01/19 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
深入解析Python中的线程同步方法
2016/06/14 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python