2013-02-09 67 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