Python装饰器简单用法实例小结


Posted in Python onDecember 03, 2018

本文总结分析了Python装饰器简单用法。分享给大家供大家参考,具体如下:

装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能。

比如,运行业务函数fun()同时打印运行花费的时间

1. 运行业务函数fun()同时打印运行花费的时间

import time
def dec(fun):
  start = time.time()
  fun()
  end = time.time()
  a = end - start
  print a
def myfun():
  print 'run myfunction'
dec(myfun)

运行结果

(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00108599662781

但是每次运行myfun都要调用dec,下面作下变动解决这个问题

2.

import time
def dec(fun):
  def wrap():
    start = time.time()
    fun()
    end = time.time()
    a = end - start
    print a
  return wrap
def myfun():
  print 'run myfunction'
myfun=dec(myfun)
myfun()

运行结果:

(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00122618675232

这个装饰器dec就实现了,并且不影响函数myfun功能

3. 装饰器@符

import time
def dec(fun):
  def wrap():
    start = time.time()
    fun()
    end = time.time()
    a = end - start
    print a
  return wrap
@dec
def myfun():
  print 'run myfunction'
myfun()

结果

(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.000470876693726

使用了@后,就不用给myfun重新赋值了

@dec就相当于myfun=dec(myfun)

例子:

def level(leveel):
  def debug(func):
    def wrapper(*args, **kwargs):
      print("[DEBUG]: enter {}()".format(func.__name__),leveel)
      return func(*args, **kwargs)
    return wrapper
  return debug
@level(leveel='debuging')
def say(something):
  print ("hello {}!".format(something))
say(123)

输出:

('[DEBUG]: enter say()', 'debuging')
hello 123!

'''
class logging(object):
  def __init__(self, func):
    self.func = func
  def __call__(self, *args, **kwargs):
    print ("[DEBUG]: enter function {func}()".format(
      func=self.func.__name__))
    return self.func(*args, **kwargs)
@logging
def say(something):
  print ("say {}!".format(something))
'''
class logging(object):
  def __init__(self, level='INFO'):
    self.level = level
  def __call__(self, func): # 接受函数
    def wrapper(*args, **kwargs):
      print ("[{level}]: enter function {func}()".format(
        level=self.level,
        func=func.__name__))
      func(*args, **kwargs)
    return wrapper #返回函数
@logging(level='INFO')
def say(something):
  print ("say {}!".format(something))
say(123)

输出:

[INFO]: enter function say()
say 123!

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的匿名函数使用简介
Apr 27 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
python计算导数并绘图的实例
Feb 29 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Python开发入门——迭代的基本使用
Sep 03 Python
Django实现随机图形验证码的示例
Oct 15 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
使用scrapy实现增量式爬取方式
Jun 21 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 #Python
利用Python实现原创工具的Logo与Help
Dec 03 #Python
对pycharm 修改程序运行所需内存详解
Dec 03 #Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 #Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 #Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 #Python
Python实现的特征提取操作示例
Dec 03 #Python
You might like
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
简单实现php上传文件功能
2017/09/21 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
<script defer> defer 是什么意思
2009/05/10 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
2020/10/02 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python3里的super()和__class__使用介绍
2015/04/23 Python
PyQt5实现下载进度条效果
2018/04/19 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
暑期社会实践证明书
2014/11/17 职场文书
2014年保险公司工作总结
2014/11/22 职场文书