今天写代码为了少传一个参数,想在装饰器中通过传入的函数获取函数所在的类,stackoverflow给出了答案
Python3中通过函数的__qualname__属性获取就好
据说Python2中可以用im_class
完整的示例代码:
from functools import wraps
def decorater(func):
@wraps(func)#保持原函数名不变
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
print('装饰器内函数名:%s'%func.__name__)
print('返回值:%s'%res)
print('函数func所属的类:%s'%func.__qualname__)
return res
return wrapper
class Name():
@decorater
def func(self,*args,**kwargs):
print('位置参数:{}'.format(args))
print('关键字参数:{}'.format(kwargs))
return 'return'
if __name__ == '__main__':
a=Name()
a.func(1,2,a=3,b=4)
print('装饰外内函数名:%s' % a.func.__name__)
打印结果:
位置参数:(1, 2)
关键字参数:{'a': 3, 'b': 4}
装饰器内函数名:func
返回值:return
函数func所属的类:Name.func
装饰外内函数名:wrapper
可以到成功获取了的函数对应的类和函数名:Name.func
参考:
https://stackoverflow.com/a/40953053/9917670
https://docs.python.org/3/library/inspect.html#types-and-members