第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

python 函數(shù)裝飾器(Function Decorators)

標簽:
Python

函数装饰器(Function Decorators)

python中函数装饰器的使用和Java中注解类似, 直接在函数定义的前一行加上装饰器即可. python除了函数装饰器还有类的装饰器.

使用及原理

@decodef target():
    pass

这样target函数就被deco装饰了, 其中deco是一个接收一个函数为参数的函数.

decorators只是一种语法糖, 和以下代码是等价的

def target():
    passtarget = deco(target)

两段代码的结果是一样的, target指向的由deco返回的函数, 而不一定指向原来定义的target函数.

总结一下: 装饰器是一个接收一个函数作为参数(可能还有其他的参数)的函数, 它的返回值也是一个函数.

另外一个重要的是装饰器的函数在运行时马上被执行, 这个应该比较好理解. 也就是说当你运行时被装饰函数马上执行. 可以看看下面这个例子

def dec(func):
    print('the decorator function is excuting')    return func@decdef target():
    print('excute target()')    
def main():
    passif __name__ == '__main__':
    main()

执行结果

the decorator function is excuting

也就是说不管有没有调用target函数, target = dec(target)都会在一开始马上执行.

另外装饰器还可以嵌套使用, 比如:

@deco1@deco2def target():
    pass#等价于def target():
    passtarget = deco1(deco2(target))

实现

首先是一个打印日志的装饰器, 输出函数名称, 传入的参数, 返回值

import functoolsdef log(func):    @functools.wraps(func)
    def wrapper(*args, **kw):
        res = func(*args, **kw)
        print('excute %s(), ' % func.__name__, 'args:', args, kw,', res:', res)        return res    return wrapper@logdef add(a, b):
    return a + bdef main():
    res = add(4, 5)
    print(res)
    print(add.__name__)if __name__ == '__main__':
    main()    
'''
excute add(),  args: (4, 5) {} , res: 9
9
add
'''

注意到我这里使用了@functools.wraps(func), 它可以让wrapper.__name__ = func.__name__. 如果不加, 那么print(add.__name__)的结果将是wrapper.

另外一个例子, 记录函数运行时间

import functools, timedef clock(func):    @functools.wraps(func)
    def clocks(*args, **kw):
        start = time.perf_counter()
        res = func(*args, **kw)
        elapsed = time.perf_counter() - start
        print('%s() excuted for %fs' % (func.__name__, elapsed))        return res    return clocks@clockdef snooze(seconds):
    time.sleep(seconds)def main():
    snooze(3)   

if __name__ == '__main__':
    main()'''
snooze() excuted for 3.001641s
'''



作者:前几
链接:https://www.jianshu.com/p/8d1410760809


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消