函数没有通用的方式引用自身。考虑改用装饰器。如果您想要的只是打印有关可以通过装饰器轻松完成的功能的信息,请执行以下 *** 作:
from functools import wrapsdef showinfo(f): @wraps(f) def wrapper(*args, **kwds): print(f.__name__, f.__hash__) return f(*args, **kwds) return wrapper@showinfodef aa(): pass
如果确实需要引用该函数,则只需将其添加到函数参数中即可:
def withself(f): @wraps(f) def wrapper(*args, **kwds): return f(f, *args, **kwds) return wrapper@withselfdef 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))@binddef 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__用于创建绑定方法的方法。装饰器仅使用现有方法使函数成为自身的绑定方法。它仅适用于独立功能,如果您想要一种能够引用自身的方法,则您必须做更多类似于原始解决方案的事情。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)