如何通过检查获取类静态方法的类名

时间:2013-02-09 08:34:15

标签: python inspection

我发现了同样的问题,但我的问题是不同的

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__

但是类静态方法没有自我论证,我该怎么办?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

您可以尝试为Aha创建包装器/装饰器。如果您不知道装饰器,我建议您阅读thisthis

以下内容应打印出函数名称,然后调用函数。

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