我有一个用例,我想用另一种调用方法来装饰方法,例如在此代码中:
def decorator(func):
def enhanced(*args, **kwargs):
func(*args, **kwargs)
func.enhanced = enhanced
return func
@decorator
def function():
pass
class X:
@decorator
def function(self):
pass
x = X()
function()
function.enhanced()
x.function()
# x.function.enhanced()
x.function.enhanced(x)
前三个调用按预期工作,但x.function.enhanced()
没有;我必须写信x.function.enhanced(x)
才能让它发挥作用。我知道这是因为func
传递给装饰器的不是绑定方法而是函数,因此需要self
显式传递。
但我怎样才能解决这个问题?从我对描述符的了解来看,它们仅在查找类时才相关,并且由于func
不是类,func.enhanced
因此无法以我可以拦截的方式查找。
有什么我可以在这里做的吗?