在 Python Cookbook 第 9.5 节中。定义具有用户可调整属性的装饰器 我一直很难理解以下代码中使用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
如果组合多个装饰器,它是否用于防止属性阴影?我不完全清楚为什么在这里使用部分,并希望得到任何澄清。
我将尝试两种解释。这是简短的。这些装饰器是等效的。
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
,它指向相同的函数。