【问题标题】:How do I get the filepath for a class in Python?如何在 Python 中获取类的文件路径?
【发布时间】:2010-10-16 09:19:00
【问题描述】:

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

我这样做的原因是因为我通常不喜欢将属于同一文件夹的文件放在一起。我想创建一个使用 Django 模板将自身呈现为 HTML 的类。基本实现应根据定义类的文件名推断模板的文件名。

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

【问题讨论】:

标签: python class introspection


【解决方案1】:

尝试:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

【讨论】:

  • 要从 C 的实例中获取路径(根据 OP 的需要),请将 LocationArtifact 替换为 obj.__class__,其中 obj 是 LocationArtifact 的实例。
【解决方案2】:

您可以像这样使用inspect 模块:

import inspect
inspect.getfile(C.__class__)

【讨论】:

  • 不确定我在做什么不同,但我不得不使用 getfile 而不是:inspect.getmodule(C.__class__)
  • 注意:不适用于用户创建的类
  • 这应该是inspect.getfile(C)。如果C 是一个类,那么C.__class__ 引用object,这将引发异常TypeError: <module 'builtins' (built-in)> is a built-in class。我认为只有c 的实例你才想使用inspect.getfile(c.__class__)。
  • 这不适用于扩展抽象基类 (metaclass=abc.ABCMeta) 的类,因为它返回 /usr/local/lib/python3.7/abc.py 而不是相应的文件。 @JarretHardie(下)的解决方案效果更好。
【解决方案3】:

这对 Django 来说是错误的方法,而且确实是强迫的。

典型的 Django 应用模式是:

  • /项目
    • /应用名称
      • models.py
      • views.py
      • /模板
        • index.html
        • 等

【讨论】:

  • +1:做 Django 自然做的事,生活就简单多了。
  • 同意。 Django 是“魔法”最少的框架之一,但模板、模板标签和应用程序在其模式中都有一些期望。如果你不得不进行古怪的类推理,那么你可能走错了方向。
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 2010-09-08
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多