首页 > 编程 > Python > 正文

Python装饰器简单用法实例小结

2020-02-15 23:54:28
字体:
来源:转载
供稿:网友

本文总结分析了Python装饰器简单用法。分享给大家供大家参考,具体如下:

装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能。

比如,运行业务函数fun()同时打印运行花费的时间

1. 运行业务函数fun()同时打印运行花费的时间

import timedef dec(fun):  start = time.time()  fun()  end = time.time()  a = end - start  print adef myfun():  print 'run myfunction'dec(myfun)

运行结果

(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00108599662781

但是每次运行myfun都要调用dec,下面作下变动解决这个问题

2.

import timedef dec(fun):  def wrap():    start = time.time()    fun()    end = time.time()    a = end - start    print a  return wrapdef myfun():  print 'run myfunction'myfun=dec(myfun)myfun()

运行结果:

(virt2) root@ubuntu:/home/z# python z.py
run myfunction
0.00122618675232

这个装饰器dec就实现了,并且不影响函数myfun功能

3. 装饰器@符

import timedef dec(fun):  def wrap():    start = time.time()    fun()    end = time.time()    a = end - start    print a  return wrap@decdef 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)@loggingdef 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)

输出:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表