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 15 Python
python字典排序实例详解
May 20 Python
python僵尸进程产生的原因
Jul 21 Python
用Pygal绘制直方图代码示例
Dec 07 Python
基于Python log 的正确打开方式
Apr 28 Python
python实现指定文件夹下的指定文件移动到指定位置
Sep 17 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
pytorch查看模型weight与grad方式
Jun 24 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
Python实现Excel自动分组合并单元格
Feb 22 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预定义常量
2006/12/25 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
一个对于js this关键字的问题
2007/01/09 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
python实现报表自动化详解
2017/11/16 Python
python kafka 多线程消费者&手动提交实例
2019/12/21 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
电气专业应届生求职信
2013/11/01 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
幼教简历自我评价
2014/01/28 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
办公室文员工作职责
2014/01/31 职场文书
开学第一周总结
2015/07/16 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记