理解python装饰器——函数装饰器、类装饰器、执行顺序

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

装饰器经常用于有切面需求的场景,比如:插入日志、性能检测、事务处理、缓存、权限校验等场景。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

下面是一个简单的装饰器。@use_logging 的作用就是将它下面的函数输入到装饰函数use_logging里面。装饰函数use_logging调用并返回了内置的warpper函数,相当于bar = use_logging(bar) = wrapper(*args,**kwargs)。证明就是当我们输出bar.__name__时,输出的却是wrapper,而且bar.__doc__的内容也丢失了。这时的bar()函数已经被wrapper函数替换了,bar()的函数体被作为wrapper的返回值。

import logging

def use_logging(func):
    def wrapper(*args, **kwargs):
        logging.warn('%s is running!'%func.__name__)
        return func(*args, **kwargs)
    return wrapper

@use_logging
def bar(name):
    """THIS IS bar's doc!"""
    print('i am %s!'%name)
bar('wtx')
print(bar.__name__)
print(bar.__doc__)

输出:
在这里插入图片描述

如何保留原函数的__name__属性和__doc__属性这样的元信息呢?

使用functools.wraps
wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中

import logging
from functools import wraps

def use_logging(func):
    @wraps(func)
    def warpper
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值