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可跨平台实现获取按键的方法
Mar 05 Python
用Python编写简单的定时器的方法
May 02 Python
详解Python爬虫的基本写法
Jan 08 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
Python之文字转图片方法
May 10 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 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
Look And Say 序列php实现代码
2011/05/22 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
2015/02/02 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
Python中属性和描述符的正确使用
2016/08/23 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
媒体宣传策划方案
2014/05/25 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
研究生简历自我评
2015/03/11 职场文书
色戒观后感
2015/06/12 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
MySQL 覆盖索引的优点
2021/05/19 MySQL