здесь я хочу добраться до класса, владеющего декорированным методом f
Вы не можете, потому что в момент оформления ни один класс не владеет методом f.
class A(object):
@returns(int)
def compute(self, value):
return value * 3
Это то же самое, что сказать:
class A(object):
pass
@returns(int)
def compute(self, value):
return value*3
A.compute= compute
Очевидно, что декоратор returns()
создается до того, как функция назначена классу владельца.
Теперь, когда вы записываете функцию в класс (либо встроенный, либо явно такой), она становится несвязанным объектом метода. Теперь он имеет ссылку на класс своего владельца, который вы можете получить, сказав:
>>> A.compute.im_class
<class '__main__.A'>
Таким образом, вы можете прочитать f.im_class внутри «new_f», который выполняется после назначения, но не в самом декораторе.
(И даже в этом случае немного уродливо полагаться на детали реализации CPython, если вам не нужно. Я не совсем уверен, что вы пытаетесь сделать, но вещи, связанные с «получить класс владельца», часто бывают выполнимо с использованием метаклассов.)