希望标题不要混淆不确定我应该怎么说。我想知道基类是否有可能知道派生类的哪个方法称为其中一个方法。
示例:
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')
因此输出方法可以知道Public类中的哪个方法称为它?
答案 0 :(得分: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
和dict
都有method
。我对其进行了更改,因此self._output
为dict
,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
答案 1 :(得分:1)
import inspect
frame = inspect.currentframe()
method_that_called_me = inspect.getouterframes(frame)[1][3]
其中method_that_called_me
将是一个字符串。 1
用于直接调用者,3
用于'帧记录'中函数名称的位置