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

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

被折叠的 条评论
为什么被折叠?



