Ответ 1
Нет никакого общего способа для функции ссылаться на себя. Вместо этого рассмотрите использование декоратора. Если все, что вам нужно, как вы указали, - это распечатать информацию о функции, которую можно легко сделать с помощью декоратора:
from functools import wraps
def showinfo(f):
@wraps(f)
def wrapper(*args, **kwds):
print(f.__name__, f.__hash__)
return f(*args, **kwds)
return wrapper
@showinfo
def aa():
pass
Если вам действительно нужна ссылка на функцию, просто добавьте ее в аргументы функции:
def withself(f):
@wraps(f)
def wrapper(*args, **kwds):
return f(f, *args, **kwds)
return wrapper
@withself
def aa(self):
print(self.__name__)
# etc.
Изменить добавление альтернативного декоратора:
Вы также можете написать более простой (и, вероятно, более быстрый) декортер, который сделает корректно выполненную работу с помощью Python-интроспекции:
def bind(f):
"""Decorate function `f` to pass a reference to the function
as the first argument"""
return f.__get__(f, type(f))
@bind
def foo(self, x):
"This is a bound function!"
print(self, x)
>>> foo(42)
<function foo at 0x02A46030> 42
>>> help(foo)
Help on method foo in module __main__:
foo(self, x) method of builtins.function instance
This is a bound function!
Это использует протокол дескриптора Python: функции имеют метод __get__
, который используется для создания связанных методов. Декоратор просто использует существующий метод, чтобы сделать функцию связанным методом. Он будет работать только для автономных функций, если вы хотите, чтобы метод мог ссылаться на себя, вам нужно будет сделать что-то большее, чем оригинальное решение.