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代码做configure文件
Jul 20 Python
Python中的urllib模块使用详解
Jul 07 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
Python中整数的缓存机制讲解
Feb 16 Python
详解python校验SQL脚本命名规则
Mar 22 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python实现简单学生信息管理系统
Apr 09 Python
python函数中将变量名转换成字符串实例
May 11 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
python字符串的一些常见实用操作
Apr 06 Python
Python闭包的定义和使用方法
Apr 11 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
python实现扫雷游戏
2020/03/03 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
护理个人求职信范文
2014/01/08 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers