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通过socket查询whois的方法
Jul 18 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python3实现二叉树的最大深度
Sep 30 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
基于Python获取城市近7天天气预报
Nov 26 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 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桌面中心(二) 数据库写入
2007/03/11 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
Mootools 1.2教程 类(一)
2009/09/15 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
python实现单机五子棋
2020/08/28 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
小班评语大全
2014/05/04 职场文书
文明班集体申报材料
2014/05/23 职场文书
民事调解书范文
2015/05/20 职场文书
升学宴家长答谢词
2015/09/29 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
Redis基本数据类型List常用操作命令
2022/06/01 Redis