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