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中is和id的用法
Apr 03 Python
python网络编程之文件下载实例分析
May 20 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Python基于WordCloud制作词云图
Nov 29 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
python爬虫如何解决图片验证码
Feb 14 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
hammer.js实现图片手势放大效果
2017/08/29 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
python引用DLL文件的方法
2015/05/11 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
python中round函数如何使用
2020/06/19 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书