파이썬에서 클래스의 파일 경로를 어떻게 얻습니까?


95

Python에서 클래스 C가 주어지면 클래스가 정의 된 파일을 어떻게 확인할 수 있습니까? 클래스 C 또는 C의 인스턴스에서 작동 할 수있는 것이 필요합니다.

내가이 작업을하는 이유는 일반적으로 같은 폴더에 함께 속한 파일을 저장하는 팬이기 때문입니다. Django 템플릿을 사용하여 HTML로 렌더링하는 클래스를 만들고 싶습니다. 기본 구현은 클래스가 정의 된 파일 이름을 기반으로 템플릿의 파일 이름을 추론해야합니다.

"base / artifacts.py"파일에 LocationArtifact 클래스를 넣은 다음 템플릿 이름이 "base / LocationArtifact.html"이되도록 기본 동작을 지정합니다.



2
그들은 당신이 파일을 찾고있는 모듈을 알고 있다고 가정하고, 클래스에서 구현 작업을 할 때 모듈 문자열을 갖게 될 것입니다.
Staale

답변:


130

다음 과 같이 inspect 모듈을 사용할 수 있습니다 .

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 19 년

36

시험:

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

1
(OP로서 원하는) C의 인스턴스에서 경로를 얻기 위해 대체 LocationArtifactobj.__class__obj가 LocationArtifact의 인스턴스이다.
martian111 19 년

5

이것은 Django에 대한 잘못된 접근 방식이며 실제로 작업을 강제합니다.

일반적인 Django 앱 패턴은 다음과 같습니다.

  • /계획
    • / appname
      • models.py
      • views.py
      • / 템플릿
        • index.html
        • 기타

1
+1 : 장고가 자연스럽게하는 일을하고 삶은 훨씬 더 간단합니다.
S.Lott

1
동의합니다. Django는 "마법"이 가장 적은 프레임 워크 중 하나이지만 템플릿, 템플릿 태그 및 앱은 패턴의 일부로 약간의 기대치를 가지고 있습니다. 이상한 클래스 추론을해야한다면 아마도 잘못된 방향으로 가고있을 것입니다.
Soviut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.