我在Stack Overflow上看到了一堆python方法解析顺序问题,其中许多问题都得到了很好的回答。我有一个不太合适。

当请求super(MyClassName, self).method_name时,我得到了(单个)父类未返回的类型。将debug放到父类中表明它没有被选中。

我会添加一些代码片段,但是代码库很大。我进入了MyClassName.__mro__中列出的每个类(它告诉我们方法解析顺序是什么),并且没有一个返回我得到的类型。所以问题是...

我可以使用Python中的哪种工具或属性来找出实际被调用的代码,以便再次发生这种情况时,我可以轻松地找出实际被调用的代码?我最终找到了解决方案,但是我宁愿知道如何以较少的劳动密集型方式来解决它。

最佳答案

您可以使用例如inspect.getmodule根据其文档:


  尝试猜测在哪个模块中定义了对象。


一个简单的示例,使用a.py

class Parent(object):

    def method(self):
        return True


b.py

import inspect

from a import Parent

class Child(Parent):

    def method(self):
        parent_method = super(Child, self).method  # get the parent method
        print "inherited method defined in {}".format(
            inspect.getmodule(parent_method),  # and find out where it came from
        )
        return parent_method()


if __name__ == '__main__':
    Child().method()


运行b.py给出结果:

Parent defined in <module 'a' from 'C:/Python27\a.py'>

09-10 06:44
查看更多