Biorąc pod uwagę klasę C w Pythonie, jak mogę określić, w którym pliku została zdefiniowana klasa? Potrzebuję czegoś, co może działać z klasy C lub z instancji poza C.
Powodem, dla którego to robię, jest to, że generalnie jestem fanem umieszczania plików, które należą do tego samego folderu. Chcę utworzyć klasę, która używa szablonu Django do renderowania się jako HTML. Podstawowa implementacja powinna wywnioskować nazwę pliku dla szablonu na podstawie nazwy pliku, w którym zdefiniowano klasę.
Powiedzmy, że umieściłem klasę LocationArtifact w pliku „base / artifacts.py”, a następnie chcę, aby domyślnym zachowaniem była nazwa szablonu „base / LocationArtifact.html”.
python
class
introspection
Staale
źródło
źródło
Odpowiedzi:
Możesz użyć modułu inspekcja , na przykład:
import inspect inspect.getfile(C.__class__)
źródło
getfile
musiałem użyć:inspect.getmodule(C.__class__)
inspect.getfile(C)
. JeśliC
jest klasą, toC.__class__
odwołuje się doobject
, co spowoduje zgłoszenie wyjątkuTypeError: <module 'builtins' (built-in)> is a built-in class
. Myślę, że tylko na przykładc
chcesz użyćinspect.getfile(c.__class__)
.metaclass=abc.ABCMeta
), ponieważ zwraca ona/usr/local/lib/python3.7/abc.py
zamiast odpowiedniego pliku. Rozwiązanie autorstwa @JarretHardie (poniżej) działało lepiej.próbować:
import sys, os os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)
źródło
LocationArtifact
wobj.__class__
którym obj jest wystąpienie LocationArtifact.To jest złe podejście dla Django i naprawdę wymuszające rzeczy.
Typowy wzorzec aplikacji Django to:
źródło