函数没有通用的方法来引用自身。考虑改用装饰器。如果您想要的只是打印有关可以使用装饰器轻松完成的功能的信息:
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__
用于创建绑定方法的方法。装饰器只是使用现有方法使函数成为自身的绑定方法。它仅适用于独立功能,如果您希望方法能够引用自身,您将不得不做一些更像原始解决方案的事情。