2013-02-09 72 views
0

我发现同样类似的问题得到类名类的静态方法,但我的问题是diffent如何通过检查

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__ 

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

+0

这似乎适得其反。你试图解决什么问题? – 2013-02-09 08:55:34

回答

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:调用追踪()
帧@ -3:呼叫到Aa()

+0

谢谢你的回答,这是我需要的 – user2056706 2013-02-09 10:26:09

+0

-3是什么意思?你能给我一些文件或其他吗?我可以使用inspect.get ..做同样的事情吗? – user2056706 2013-02-09 10:28:24

+0

-3是框架列表结尾的第三个条目,3是框架本身的第三个字段......如果它是您正在寻找的内容,请不要忘记接受答案:) – isedev 2013-02-09 10:48:56

1

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

类似下面的内容应打印出函数名称,然后调用该函数。

​​

回报

In [16]: f() 
function f has been called 
in the function 
+0

谢谢你的回答,但是我需要什么类名称,不仅是函数名。 – user2056706 2013-02-09 10:29:20

+0

ups,我错过了一个细节,对不起。我认为你可以构建包装类作为输入,然后打印类名 – 2013-02-09 12:15:05