Python装饰器

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

完整示例

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))

解决查看函数信息的方法失效的问题

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)
print(index.__name__)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 部分细节自己改了点,也加了点自己例子,基本上属于转载。转载出处:https://my.oschina.net/le...
    洛克黄瓜阅读 6,030评论 0 3
  • 一、史前故事 先看一个简单例子,实际可能会复杂很多: 现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码...
    DevinZhang阅读 4,243评论 4 22
  • Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个...
    stoneyang94阅读 5,152评论 1 4
  • 如果看完这一篇文章还不理解装饰器,这说明我写的还不够清晰、详细,那请鼓励鼓励我吧。 讲 Python 装饰器前,我...
    龙皓晨阅读 3,938评论 0 8
  • 一个城市没有湖水,就少了几分灵气;一个城市少了一座山峰,就缺了几分霸气。 东莞是一个既有山也有水的城市,山有黄旗山...
    醒者阅读 3,529评论 0 0