如何通过反射获取类静态方法的类名

2 投票
2 回答
1561 浏览
提问于 2025-04-17 15:20

我发现有类似的问题,但我的问题不一样。

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()

撰写回答