Як отримати файл-шлях для класу в Python?


95

З огляду на клас C в Python, як я можу визначити, у якому файлі визначено клас? Мені потрібно щось, що може працювати або з класу C, або з екземпляра, вимкненого C.

Причина, по якій я це роблю, полягає в тому, що я, як правило, шанувальник зберігання файлів, що належать разом, в одну папку. Я хочу створити клас, який використовує шаблон Django для відображення себе як HTML. Базова реалізація повинна вивести ім'я файлу для шаблону на основі імені файлу, у якому визначено клас.

Скажімо, я помістив клас LocationArtifact у файл "base / artifacts.py", тоді я хочу, щоб поведінка за замовчуванням полягала в тому, що назва шаблону - "base / LocationArtifa.html".



2
Ті припускають, що ви знаєте модуль, для якого шукаєте файл, я просто матиму рядок модуля, коли я працюю з реалізаціями поза класом.
Стейл

Відповіді:


130

Ви можете використовувати модуль перевірки , як це:

import inspect
inspect.getfile(C.__class__)

1
Не впевнений, що я роблю по-іншому, але замість цього getfileмені довелося скористатися: inspect.getmodule(C.__class__)
AJP

4
Примітка: не працює на класах, створених користувачем
Даніель Браун

6
Це, мабуть, має бути inspect.getfile(C). Якщо Cце клас, то C.__class__посилається на object, що призведе до виключення TypeError: <module 'builtins' (built-in)> is a built-in class. Я думаю, що cви хочете використовувати лише для екземпляра inspect.getfile(c.__class__).
cheshirekow

1
Це не було для класу, який розширює абстрактний базовий клас ( metaclass=abc.ABCMeta), оскільки він повертається /usr/local/lib/python3.7/abc.pyзамість відповідного файлу. Рішення @JarretHardie (нижче) працювало краще.
martian111

36

спробуйте:

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

1
Щоб отримати шлях від екземпляра C (за бажанням OP), замініть LocationArtifactтим, obj.__class__де obj є екземпляром LocationArtifact.
martian111

5

Це неправильний підхід для Django і насправді форсує речі.

Типовий шаблон програми Django:

  • / проект
    • / ім'я програми
      • models.py
      • views.py
      • / шаблони
        • index.html
        • тощо.

1
+1: Робити те, що робить Джанго природно, а життя набагато простіше.
С.Лотт

1
Домовились. Django - одна з рамок з найменшою кількістю "магії", але шаблони, теги шаблонів і додатки мають певні очікування як частина їхнього малюнка. Якщо вам доведеться робити дурний висновок класу, ви, ймовірно, йдете в неправильному напрямку.
Радянський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.