Учитывая класс C в Python, как я могу определить, в каком файле был определен класс? Мне нужно что-то, что может работать либо с классом C, либо с экземпляром с C.
Причина, по которой я это делаю, заключается в том, что я вообще фанат того, что файлы, которые принадлежат друг другу, находятся в одной папке. Я хочу создать класс, который использует шаблон Django для рендеринга себя как HTML. Базовая реализация должна вывести имя файла для шаблона на основе имени файла, в котором определен класс.
Скажем, я поместил класс LocationArtifact в файл «base / artifacts.py», затем я хочу, чтобы по умолчанию использовалось имя шаблона «base / LocationArtifact.html».
python
class
introspection
Staale
источник
источник
Ответы:
Вы можете использовать модуль проверки , например:
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 (ниже) сработало лучше.пытаться:
import sys, os os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)
источник
LocationArtifact
с ,obj.__class__
где OBJ является экземпляром LocationArtifact.Это неправильный подход для Django и действительно форсирование вещей.
Типичный шаблон приложения Django:
источник