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中yield关键词的作用与用法
Nov 29 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python对文件目录的操作方法实例总结
Jun 24 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 Python
Python Process创建进程的2种方法详解
Jan 25 Python
PyQt5爬取12306车票信息程序的实现
May 14 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
拼音码表的生成
2006/10/09 PHP
改进的IP计数器
2006/10/09 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
详解php用static方法的原因
2018/09/12 PHP
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
用Python实现KNN分类算法
2017/12/22 Python
python组合无重复三位数的实例
2018/11/13 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
蓝颜请假条
2014/04/11 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
联片教研活动总结
2014/07/01 职场文书
自我检讨报告
2015/01/28 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
实用求职信模板范文
2019/05/13 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
python​格式化字符串
2022/04/20 Python