Python:找出派生类上的什么方法,称为基类方法

时间:2010-08-30 21:02:13

标签: 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')

因此输出方法可以知道Public类中的哪个方法称为它?

2 个答案:

答案 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.outputdict都有method。我对其进行了更改,因此self._outputdictself.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)

查看inspect module

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

其中method_that_called_me将是一个字符串。 1用于直接调用者,3用于'帧记录'中函数名称的位置