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字符串替换的2种方法
Nov 30 Python
python文件写入实例分析
Apr 08 Python
Python批量创建迅雷任务及创建多个文件
Feb 13 Python
Python正则表达式使用经典实例
Jun 21 Python
python+pandas分析nginx日志的实例
Apr 28 Python
Django如何防止定时任务并发浅析
May 14 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
对python while循环和双重循环的实例详解
Aug 23 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
python如何输出反斜杠
Jun 18 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 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读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
Yii2中datetime类的使用
2016/12/17 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python hashlib模块的使用示例
2020/10/09 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
观看《永远的雷锋》心得体会
2014/03/12 职场文书
户外活动策划方案
2014/03/12 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
房屋买卖协议样本
2014/11/16 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python