装饰器partial、update_wrapper、wraps作用以及如何使用

装饰器partial、update_wrapper、wraps作用以及如何使用

在讲解partial、update_wrapper、以及wraps之前需要了解下装饰器:装饰器在实现的时候,被修饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生比变化)。因此,为了不影响,python使用wraps来消除这样的副作用,因此,在我们写装饰器的时候,最好在实现之前加上wraps,它能保留原有函数的属性

1. partial

  • 有什么用?

    partial又叫偏函数。函数在执行的时候需要带上必要的参数,有些参数是执行之前就是可知的,这种情况下,一个函数有一个或者多个函数预先就能用上,以便函数能够更少的参数进行调用

  • 如何使用?

    • 首先先定义一个函数
    def add(x, y):
        return x + y
    • 然后再利用partial对定义一个新的函数
    add1 = partial(add, y=3) # 这里创建了一个新的函数
    • 最后再调用add1
    print add1(4)  # 7
    print add(x=4, y=9) # 13

2. update_wrapper

  • 有什么用?

    update_wrapper这个函数的主要功能是负责copy原函数的一些属性,如moudlenamedoc、等,如果不加update_wrapper,那么被装饰器修饰的函数就会丢失其上面的一些属性信息

  • 如何使用?

    • 首先定义一个函数
    def wrapper(f):
        def wrapper_function(*args, **kwargs):
            """这个是修饰函数"""
            return f(*args, **kwargs)
        update_wrapper(wrapper_function, f)  # <<  添加了这条语句
        return wrapper_function
    • 利用装饰器定义一个新的函数
    @wrapper
    def wrapped():
        """这个是被修饰的函数"""
        pass
    • 最后输出被装饰器修饰的函数的信息
    print(wrapped.__doc__)  # 输出`这个是被修饰的函数`
    print(wrapped.__name__)  # 输出`wrapped`
    • __doc____name__属性已经是wrapped函数中的,当然,update_wrapper函数也对__module____dict__等属性进行了更改和更新

3. wraps

  • 有什么作用?

    被装饰器修饰后的函数会编程另外一个函数,为了不受影响,利用wraps来消除这样的副作用,使它能够保持原函数的属性。

  • 如何使用?

    • 首先先定义一个函数
    def wrapper(f):
        @wraps(f)
        def wrapper_function(*args, **kwargs):
            """这个是修饰函数"""
            return f(*args, **kwargs)
        return wrapper_function
    • 利用装饰器定义一个新的函数
    @wrapper
    def wrapped():
        """这个是被修饰的函数
        """
        pass
    • 最后输出被装饰器修饰的函数的信息
    print(wrapped.__doc__)  # 输出`这个是被修饰的函数`
    print(wrapped.__name__)  # 输出`wrapped`

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值