1

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

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__

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

4

2 回答 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
于 2013-02-09T08:58:13.620 回答
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()

给定名称,您可以通过从名称中提取并在模块的命名空间中查找它来获取类对象......

以供参考:

框架@-1:调用traceback.extract_stack()
框架@-2:调用trace()
框架@-3:调用Aa()

于 2013-02-09T08:40:43.630 回答