gpt4 book ai didi

python - 在将函数附加为对象属性的装饰器中使用 functools.partial

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:48 24 4
gpt4 key购买 nike

Python Cookbook 部分 9.5. Defining a Decorator with User Adjustable Attributes我一直难以理解以下代码中 functools.partial 的使用:

# Utility decorator to attach a function as an attribute of obj
def attach_wrapper(obj, func=None):
if func is None:
return partial(attach_wrapper, obj)
setattr(obj, func.__name__, func)
return func

如果组合多个装饰器,它是否用于防止属性阴影?我不是很清楚为什么要在这里使用 partial,如果有任何说明,我将不胜感激。

最佳答案

我会尝试两种解释。这是最短的。这些装饰器是等价的。

def attach_wrapper(obj, func=None):
if func is None:
return partial(attach_wrapper, obj)
setattr(obj, func.__name__, func)
return func


def my_attach_wrapper(obj):
def wrapper(func):
setattr(obj, func.__name__, func)
return func
return wrapper

这是长版。这是包装器的分步操作。

@attach_wrapper(wrapper)
def set_level(newlevel):
level = newlevel

相当于:

def set_level(newlevel):
level = newlevel

set_level = attach_wrapper(wrapper)(set_level)

首先,attach_wrapper(wrapper, func=None) 返回一个带有一个参数的部分函数,​​func。为简单起见,我们将此新函数称为 partial_attach。我们可以这样定义它:

def partial_attach(func):
setattr(wrapper, func.__name__, func)
return func

attach_wrapper(wrapper, func=None) 返回 partial_attach 时,我们有:

set_level = partial_attach(set_level)

因为它返回 set_level,所以 set_level 等于它自己。但是现在 wrapper 有一个属性,set_level,它指向同一个函数。

关于python - 在将函数附加为对象属性的装饰器中使用 functools.partial,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48098569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com