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)

'''
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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值