找到文件加载基类定义变量的路径

时间:2016-06-28 22:53:30

标签: python python-2.7

我有以下示例代码:

$ cat f1.py
class classA(object):
    var1 = "something"

$ cat f2.py
from f1 import classA
class classB(classA):
    pass

$ cat loader.py
#!/usr/bin/python -tt
from f2 import classB

if __name__ == "__main__":
    for cl in classB.__mro__:
        print cl.__module__

$ ./loader.py
f2
f1
__builtin__

我想打印定义classB(f2.py)和classA(f1.py)的文件的绝对路径或相对路径。具体来说,我想知道实际定义var1的类的文件。如果我有一个真正的模块,那么我得到了mymodule.f1看起来我必须在sys.path中搜索才能在磁盘上找到它。

有更简单的方法吗?为什么类(即非实例)不具有__file__属性?

2 个答案:

答案 0 :(得分:2)

您需要inspect模块。

import inspect
inspect.getfile(ClassA.__class__)
inspect.getfile(ClassB.__class__)

答案 1 :(得分:1)

最简单的方法是:

sys.modules[__module__].__file__

我们修改上面的loader.py来说:

if __name__ == "__main__":
    for cl in classB.__mro__:
        print sys.modules[cl.__module__].__file__

$ ./loader.py
/Users/virgilg/Code/testing/python/f2.pyc
/Users/virgilg/Code/testing/python/f1.pyc

要回答问题"哪个文件/类定义了var1?",我们可以这样做:

if __name__ == "__main__":
    oldCl = None
    for cl in classB.__mro__:
        if not hasattr(cl, 'var1'):
            break
        oldCl = cl


    print sys.modules[oldCl.__module__].__file__

$ ./loader.py
/Users/virgilg/Code/testing/python/f1.pyc