<p>实际上,您可以使用inspect module获取函数的签名,并且假设您遵循通过第一个参数“self”引用类对象的约定,则可以执行以下操作:</p>
<pre><code>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
</code></pre>
<p>如果这是一个函数,它将打印方法module、class和name,或者只打印module和name</p>
<p>从python3.3以后,<code>fn.__qualname__</code>可用于获取函数/方法的限定名。在</p>
^{pr2}$
<p>这对函数和方法都很有效:</p>
<pre><code>In [1]: class A():
...: @print_name()
...: def a():
...: print('Hi from A.a')
In [2]: A.a()
__main__.A.a
Hi from A.a
In [25]: @print_name()
...: def b():
...: print('Hi from b')
...:
In [26]: b()
__main__.b
Hi from b
</code></pre>