考虑这种情况:
#!/usr/bin/env python # -*- coding: utf-8 -*- import functools def wrapmethod(f): @functools.wraps(f) def wrap(*args, **kwargs): print '>> %s' % (f.func_name) # Here I'll do pre-processing r = f(*args, **kwargs) # Here I'll do post-processing return r return wrap @wrapmethod def foo(): pass class Test(object): @wrapmethod def foo(self): pass test = Test() test.foo() foo()
它会输出这个,正如您在http://codepad.org/Y4xXyjJO中看到的那样:
>> foo >> foo
我想知道在第一行打印出Test.foo
的方法,指出该方法所链接的类。
有什么想法吗?它有可能吗?
提前谢谢。
答案 0 :(得分:3)
这不容易实现。
如果你添加self
作为内部函数的第一个参数,你可以使用self.__class__.__name__
来访问类名,但是在装饰没有参数的无类函数时它会破坏(如果它有参数,它会将第一个参数视为self
)。
因此,除非有办法确定某个函数是否已在对象上下文中调用,否则无法实现。
顺便说一句..你需要什么?这听起来像是可以更好地解决的问题。
答案 1 :(得分:2)
实际上,您可以使用inspect模块获取函数的签名,并假设您遵循通过第一个参数' self'引用类对象的约定,您可以执行以下:
import inspect
def print_name(*_args):
def _print_name(fn):
def wrapper(*args, **kwargs):
try :
is_method = inspect.getargspec(fn)[0][0] == 'self'
except :
is_method = False
if is_method :
name = '{}.{}.{}'.format(fn.__module__, args[0].__class__.__name__, fn.__name__)
else :
name = '{}.{}'.format(fn.__module__, fn.__name__)
print (name)
return fn(*args,**kwargs)
return wrapper
return _print_name
这将打印方法模块,类和名称,或仅打印模块和名称,如果这是一个函数