如何在Python中获取类的文件路径?

如何在Python中获取类的文件路径?,python,class,introspection,Python,Class,Introspection,给定Python中的C类,如何确定该类是在哪个文件中定义的?我需要一些可以从C类或C之外的实例工作的东西 我之所以这样做,是因为我通常是一个粉丝,不愿意把属于同一个文件夹的文件放在一起。我想创建一个使用Django模板将自身呈现为HTML的类。基本实现应该根据类在其中定义的文件名推断模板的文件名 假设我在文件“base/artifacts.py”中放置了一个类LocationArtifact,那么我希望默认行为是模板名为“base/LocationArtifact.html”。尝试: impor

给定Python中的C类,如何确定该类是在哪个文件中定义的?我需要一些可以从C类或C之外的实例工作的东西

我之所以这样做,是因为我通常是一个粉丝,不愿意把属于同一个文件夹的文件放在一起。我想创建一个使用Django模板将自身呈现为HTML的类。基本实现应该根据类在其中定义的文件名推断模板的文件名

假设我在文件“base/artifacts.py”中放置了一个类LocationArtifact,那么我希望默认行为是模板名为“base/LocationArtifact.html”。

尝试:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)
您可以使用该模块,如下所示:

import inspect
inspect.getfile(C.__class__)

对于Django来说,这是一种错误的方法,实际上是强迫性的

典型的Django应用程序模式是:

  • /project
    • /appname
      • models.py
      • views.py
      • /templates
        • index.html
        • 等等

Duplicate:,假设您知道要查找文件的模块,我将在处理类外的实现时只使用模块字符串。+1:做Django自然做的事情,生活会简单得多。同意。Django是“魔力”最少的框架之一,但模板、模板标签和应用程序作为其模式的一部分有一些期望。如果你不得不做古怪的类推断,你可能走错了方向。不确定我做了什么不同,但我不得不使用
inspect.getmodule(C.。\uu class\uuuuuuuuuuuuuuuuu)
而不是
inspect.getfile(C)
,注意:对用户创建的类不起作用这应该是
inspect.getfile(C)
。如果
C
是一个类,那么
C.\uu class\uuu
指的是
对象
,这将引发异常
TypeError:是一个内置类
。我认为只有在实例
c
中,才需要使用
inspect.getfile(c.\uu class\uuu)
。对于扩展抽象基类(
metaclass=abc.ABCMeta
)的类,这不适用,因为它返回
/usr/local/lib/python3.7/abc.py
,而不是相应的文件。@JarretHardie(下面)的解决方案效果更好。要从C实例(如OP所需)获取路径,请将
LocationArtifact
替换为
obj.\uu class\uuuu
,其中obj是LocationArtifact的实例。