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多线程(python多线程简明教程)
Jun 09 Python
python学习数据结构实例代码
May 11 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
讲解Python实例练习逆序输出字符串
May 06 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图像处理类代码分享
2012/01/19 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python实现全排列的打印
2018/08/18 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python实现代码统计程序
2019/09/19 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
女大学生毕业找工作的自我评价
2013/10/03 职场文书
机关党员公开承诺书
2014/08/30 职场文书
八一建军节主持词
2015/07/01 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
Java基础-封装和继承
2021/07/02 Java/Android