Не существует общего способа для функции ссылаться на себя.Попробуйте вместо этого использовать декоратор.Если все, что вы хотели, как вы указали, это напечатать информацию о функции, которую можно легко сделать с помощью декоратора:
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.introspection:
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__
, который используется для создания связанных методов.Декоратор просто использует существующий метод, чтобы сделать функцию связанным методом самого себя.Он будет работать только для автономных функций, если вы хотите, чтобы метод мог ссылаться на себя, вам пришлось бы делать что-то более похожее на оригинальное решение.