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

Sta*_*ale 81 python class introspection

给定Python中的C类,如何确定该类定义的文件?我需要一些可以在C类或C语言实例中起作用的东西.

我这样做的原因是因为我一般都喜欢把属于同一文件夹的文件放在同一个文件夹中.我想创建一个使用Django模板将其自身呈现为HTML的类.基本实现应该根据定义类的文件名推断模板的文件名.

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

DNS*_*DNS 112

您可以使用inspect模块,如下所示:

import inspect
inspect.getfile(C.__class__)
Run Code Online (Sandbox Code Playgroud)

  • 这可能应该是“inspect.getfile(C)”。如果 `C` 是一个类,那么 `C.__class__` 引用 `object`,这将引发异常 `TypeError: <module 'builtins' (built-in)> is abuilt-in class`。我认为只有对于“c”实例,您才想使用“inspect.getfile(c.__class__)”。 (11认同)
  • 注意:不适用于用户创建的类 (2认同)
  • 这不适用于扩展抽象基类(`metaclass=abc.ABCMeta`)的类,因为它返回`/usr/local/lib/python3.7/abc.py`而不是适当的文件。@JarretHardie(如下)的解决方案效果更好。 (2认同)

Jar*_*die 32

尝试:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)
Run Code Online (Sandbox Code Playgroud)

  • 要从 C 实例获取路径(如 OP 所需),请将 `LocationArtifact` 替换为 `obj.__class__`,其中 obj 是 LocationArtifact 的实例。 (3认同)

Sov*_*iut 5

对于Django而言,这是错误的方法,并且实际上是强迫的。

典型的Django应用模式为:

  • /项目
    • / appname
      • models.py
      • views.py
      • /模板
        • index.html
        • 等等