Python 装饰器之copy_properties

本文深入探讨了Python中装饰器的概念及其实现原理,包括如何解决装饰器应用后带来的副作用问题,如函数名称和文档字符串丢失等。同时介绍了几种实用技巧,如通过自定义函数copy_properties来保留被装饰函数的原始属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文档字符串
Python的文档
Python是文档字符串Documentation Strings
在函数语句块的第一行,且习惯是多行的文本,所以多使用三引号
惯例是首字母大写,第一行写概述,空一行,第三行写详细描述
可以使用特殊属性__doc__访问这个文档

def add(x,y):
	"""This is a function of addition"""
	a = x+y
	return x + y
	print("name={}\ndoc={}".format(add.__name__, add.__doc__))
print(help(add))

函数被装饰后副作用:原函数对象(被封装函数)的属性都被替换

#副作用:原函数对象(被封装函数)的属性都被替换
def logger(fn):
    def wrapper(*args,**kwargs):
        'I am wrapper'
        print('begin')
        x = fn(*args, **kwargs)
        print('end')
        return x
    return wrapper

@logger    #add = logger(add)
def add(x,y):
	'''This is a function for add'''
	return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))

copy_properties函数
提供一个函数,被封装函数属性 copy> 包装函数属性,即:copy_properties(fn被包装函数, wrapper包装函数)

def copy_properties(src, dst): # 可以改造成装饰器 src被包装函数;dst包装函数
	dst.__name__ = src.__name__
	dst.__doc__ = src.__doc__
def logger(fn):
	def wrapper(*args,**kwargs):
		'I am wrapper'
		print('begin')
		x = fn(*args,**kwargs)
		print('end')
		return x
	copy_properties(fn, wrapper)
	return wrapper
@logger #add = logger(add)
def add(x,y):
	'''This is a function for add'''
	return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))

通过copy_properties函数将被包装函数的属性覆盖掉包装函数
凡是被装饰的函数都需要复制这些属性,copy_properties函数通用性强
可以将复制属性的函数构建成装饰器函数,带参装饰器

提供一个函数,被封装函数属性 copy> 包装函数属性,改造成带参装饰器

def copy_properties(src):
    def _copy(dst):
        dst.__name__=src.__name__
        dst.__doc__=src.__doc__
        return dst
    return _copy

def logger(fn):
    @copy_properties(fn)  # wrapper = copy_properties(fn)(wrapper)
    def wrapper(*args,**kwargs):
        'I am wrapper'
        print('begin')
        x = fn(*args, **kwargs)
        print('end')
        return x
    return wrapper

@logger    #add = logger(add)
def add(x,y):
	'''This is a function for add'''
	return x + y
print("name={}, doc={}".format(add.__name__, add.__doc__))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值