我有以下示例代码:
$ 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__
属性?
答案 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