У меня есть сценарий использования, в котором я хочу украсить метод дополнительным способом его вызова, например, в этом коде:
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
не ищется таким образом, чтобы я мог его перехватить.
Есть ли что-то, что я могу сделать здесь?