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并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
详谈python http长连接客户端
Jun 12 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
django中静态文件配置static的方法
May 20 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
python tkinter组件使用详解
Sep 16 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
基于Python模拟浏览器发送http请求
Nov 06 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的加密方式及原理
2012/06/14 PHP
php的4种常见运行方式
2015/03/20 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python中stdout输出不缓存的设置方法
2014/05/29 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
python下载的库包存放路径
2020/07/27 Python
基于python实现操作redis及消息队列
2020/08/27 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
社区禁毒工作方案
2014/06/02 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
基于PyQt5制作一个群发邮件工具
2022/04/08 Python