python @warps装饰器及源码剖析

本文探讨了Python装饰器的工作原理,尤其是@wraps装饰器的作用。@wraps用于保留被装饰对象的属性,如doc字符串和名称,避免在使用装饰器时丢失这些重要信息。通过示例,展示了未使用@wraps时可能出现的问题,以及应用@wraps后的正确行为。同时,简要解析了@wraps的源码,强调WRAPPER_ASSIGNMENTS和WRAPPER_UPDATES的作用。

python装饰器的原理是将装饰对象传入,将装饰对象加强后再返回,但是我们此时调用装饰对象的时候,其实是调用装饰器对象,如下:

@decorator
def fn():
    pass

@语法糖其实相当于decorator(fn)
python这种动态语言很多功能是以鸭子方式来实现的,即看着像鸭子,游着像鸭子我们就认为它是鸭子
这个也是一样,我们虽然调用的是装饰器,但是实现的效果一样,所以我们认为它就是一样的
但是这样会有一些坑,比如之前的装饰对象会有一些属性丢失,如下列例子:

def decorator_single_obj(cls, *args, **kwargs):
    instance = {}  # 创建字典来保存实例

    def get_instance(*args, **kwargs):
        if cls not in instance:  # 若实例不存在则新建
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return get_instance


@decorator_single_obj
class Foo(object):
    age = 24

    def __init__(self, name):
        self.name = name

    @classmethod
    def
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值