如何在 Python 中获取类的文件路径?
Posted
技术标签:
【中文标题】如何在 Python 中获取类的文件路径?【英文标题】:How do I get the filepath for a class in Python? 【发布时间】:2010-10-16 09:19:00 【问题描述】:给定 Python 中的 C 类,我如何确定该类是在哪个文件中定义的?我需要可以从 C 类或 C 类实例中工作的东西。
我这样做的原因是因为我通常不喜欢将属于同一文件夹的文件放在一起。我想创建一个使用 Django 模板将自身呈现为 html 的类。基本实现应根据定义类的文件名推断模板的文件名。
假设我在文件“base/artifacts.py”中放置了一个类 LocationArtifact,那么我希望默认行为是模板名称是“base/LocationArtifact.html”。
【问题讨论】:
复制:***.com/questions/269795/…, ***.com/questions/602846/… 那些假设你知道你正在查找文件的模块,当我使用一个类的实现时,我只会有模块字符串。 【参考方案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 是“魔法”最少的框架之一,但模板、模板标签和应用程序在其模式中都有一些期望。如果你不得不进行古怪的类推理,那么你可能走错了方向。以上是关于如何在 Python 中获取类的文件路径?的主要内容,如果未能解决你的问题,请参考以下文章