如何通过反射获取类静态方法的类名
我发现有类似的问题,但我的问题不一样。
def trace ():
?
class A():
@staticmethod
def Aha():
trace ()
...
我想要追踪输出。
A.Aha() 被调用了。
我知道怎么通过检查来获取函数名,也知道怎么获取 instance.method
的类名,像这样:
self_argument = frame.f_code.co_varnames[0] # This *should* be 'self'.
instance = frame.f_locals[self_argument]
class_name = instance.__class__.__name__
但是类的静态方法没有 self 参数,我该怎么办呢?
2 个回答
1
你可以尝试为 Aha
创建一个包装器或装饰器。如果你不知道什么是装饰器,我建议你看看 这个链接 和 这个链接。
下面这样的代码应该可以先打印出函数的名字,然后再调用这个函数。
def wrapper(func):
def inner(*args, **kwargs):
print("function {0} has been called".format(func.__name__))
return func(*args, **kwargs)
return inner
@wrapper
def f():
print "I'm in the function
返回
In [16]: f()
function f has been called
in the function
1
静态方法的定义就是这样:它在调用时不需要类的参数(像类方法那样),也不需要实例的参数(像实例方法那样)。一个在模块范围内声明的函数和静态方法之间唯一的真正区别是,方法的名字是在类的命名空间中定义的,而不是在模块的命名空间中。
换句话说,你不能直接访问类对象。你可以通过查看调用栈来获取函数名(虽然我不太确定这有多大用处):
>>> import sys
>>> import traceback
>>> class A(object):
@staticmethod
def a():
trace()
>>> def trace():
print traceback.extract_stack(sys._getframe())[-3][3]
>>> A.a()
A.a()
有了这个名字,你可以通过从名字中提取信息,然后在模块的命名空间中查找来获取类对象……
供参考:
frame @ -1 : 调用 traceback.extract_stack()
frame @ -2 : 调用 trace()
frame @ -3 : 调用 A.a()