2010-07-13 27 views
4

中的對象假設我有一個自由的函數,它已經從類方法中調用。有沒有一種方法可以讓我在自由函數中反思調用堆棧並確定哪個對象叫我?python自檢 - 如何檢測我在

def foo(arg1) : 
    s = ? #Introspect call stack and determine what object called me 
    # Do something with s 

謝謝!

+0

檢查這個http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application 對於你的情況,我會建議使用http://docs.python.org/ library/traceback.html – CriGoT 2010-07-13 15:29:17

+1

製作類的'foo'部分並移除對調用該方法的對象的所有懷疑不是更簡單嗎? – 2010-07-13 15:36:27

+0

我也很好奇知道爲什麼需要它?爲什麼你不能只傳遞調用對象作爲參數? – 2010-07-13 16:15:10

回答

2

確實沒有「呼叫對象」的概念。您可以內省棧和發現,如果你調用功能有一個名爲self第一的說法,我想 - 如果你直接從正常編碼實例方法調用(絕對一個class method像你說的。 ..我想你只是可怕地說錯了,因爲的的目的是而不是有「一個對象」,即一個實例,涉及! - ),應該檢測到這一點。

inspect模塊爲您提供工具,先進的內省(建議僅調試和開發目的,絕不「實際生產中使用」!)。但是,請注意,即使跟蹤函數也不是微不足道的:您得到堆棧幀其中指向代碼對象(其中不指向指向該函數)。

仍然,它可以排列,因爲也有指向棧幀的局部變量的僞字典,參數是局部變量,所以你要找的是你的局部變量的條目來電者的堆棧幀名爲self(此外,當然你需要很多的樂觀和幸運,因爲沒有人勢力你的來電者被合理地編碼 - 通常名爲self的參數可能被命名爲否則,並且那麼你有麻煩了;-)。

+0

關於所提到的類方法的一個好處是,即使其他語言也包含了這個沒有綁定到實例的方法的術語 – 2010-07-13 15:31:01

+0

@Matt,我相信我們特別借用了Smalltalk的名稱(和概念)。 – 2010-07-13 15:32:29