2010-08-30 95 views
1

希望標題不要混淆不知道該怎麼說。我想知道基類是否有可能知道派生類的哪個方法稱爲其方法之一。Python:找出派生類稱爲基類方法的什麼方法

例子:

class Controller(object): 
    def __init__(self): 
     self.output = {} 

    def output(self, s): 
     method_that_called_me = #is it possible? 
     self.output[method_that_called_me] = s 

class Public(Controller): 
    def about_us(self): 
     self.output('Damn good coffee!') 

    def contact(self): 
     self.output('contact me') 

所以是有可能的輸出方法知道哪些方法從公共類叫的嗎?

+0

什麼是「輸出」?一個「字典」或「方法」? – 2010-08-30 21:09:36

+0

字典,我做了一些奇怪的事嗎?我是Python的新手。 – Pickels 2010-08-30 21:10:30

+0

〜unutbu解釋我做錯了什麼。 – Pickels 2010-08-30 21:15:14

回答

4

有一種神奇的方式來做你想要在調用堆棧上使用自省的東西。但是這不是可移植的,因爲並不是所有的Python實現都具有必要的功能。使用自省也許不是一個好的設計決定。

更好,我認爲,要明確:

class Controller(object): 
    def __init__(self): 
     self._output = {} 

    def output(self, s, caller): 
     method_that_called_me = caller.__name__ 
     self._output[method_that_called_me] = s 

class Public(Controller): 
    def about_us(self): 
     self.output('Damn good coffee!',self.about_us) 

    def contact(self): 
     self.output('contact me',self.contact) 

PS。請注意,您有self.output作爲dictmethod。我已經改變了它,所以self._outputdict,並且self.output是該方法。

PPS。只是爲了顯示你什麼,我指的是通過神奇的反省:

import traceback 

class Controller(object): 
    def output_method(self, s): 
     (filename,line_number,function_name,text)=traceback.extract_stack()[-2] 
     method_that_called_me = function_name 
     self.output[method_that_called_me] = s 
+0

感謝您的回答,我從Python IRC頻道得到了相同的建議。最好是明確的。哈哈,謝謝你的PS沒有看到。 – Pickels 2010-08-30 21:12:48

+0

太棒了,每次刷新時都會有更好的信息。 – Pickels 2010-08-30 21:17:27

1

看一看的inspect module

import inspect 
frame = inspect.currentframe() 
method_that_called_me = inspect.getouterframes(frame)[1][3] 

其中method_that_called_me將是一個字符串。 1用於直接呼叫者,3函數名稱在「幀記錄」中的位置

+0

雖然這在技術上回答了這個問題,但正確的答案是「明確的」。如果您需要使用檢查模塊恢復黑客行爲,那麼您做的事情非常錯誤(或者您不應該首先詢問) – 2010-08-30 21:22:42

相關問題