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利用beautifulSoup实现爬虫
Sep 29 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
python生成器表达式和列表解析
Mar 10 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
Python工厂函数用法实例分析
May 14 Python
python实现爬取图书封面
Jul 05 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
Python 3 判断2个字典相同
Aug 06 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 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获取某个目录大小的代码
2008/09/10 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
javascript学习之闭包分析
2010/12/02 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
js中null与空字符串""的区别讲解
2019/01/17 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
毕业生的自我评价分享
2013/12/18 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
关爱空巢老人感想
2015/08/11 职场文书
新党员入党决心书
2015/09/22 职场文书
七年级作文之英语老师
2019/10/28 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers