Wie kann ich bei einer Klasse C in Python feststellen, in welcher Datei die Klasse definiert wurde? Ich brauche etwas, das entweder in der Klasse C oder in einer Instanz außerhalb von C funktioniert.
Der Grund, warum ich das mache, ist, dass ich im Allgemeinen ein Fan davon bin, Dateien, die zusammen gehören, in denselben Ordner zu legen. Ich möchte eine Klasse erstellen, die eine Django-Vorlage verwendet, um sich selbst als HTML zu rendern. Die Basisimplementierung sollte den Dateinamen für die Vorlage basierend auf dem Dateinamen ableiten, in dem die Klasse definiert ist.
Angenommen, ich habe eine Klasse LocationArtifact in die Datei "base /ifacts.py" eingefügt. Dann möchte ich, dass das Vorlagenname standardmäßig "base / LocationArtifact.html" lautet.
quelle
Antworten:
Sie können das Inspect- Modul folgendermaßen verwenden:
quelle
getfile
ichinspect.getmodule(C.__class__)
inspect.getfile(C)
. WennC
es sich um eine Klasse handelt, wirdC.__class__
auf verwiesenobject
, wodurch eine Ausnahme ausgelöst wirdTypeError: <module 'builtins' (built-in)> is a built-in class
. Ich denke, dass Sie nur für eine Instanzc
verwenden möchteninspect.getfile(c.__class__)
.metaclass=abc.ABCMeta
) erweitert, da sie/usr/local/lib/python3.7/abc.py
anstelle der entsprechenden Datei zurückgegeben wird. Die Lösung von @JarretHardie (unten) hat besser funktioniert.Versuchen:
quelle
LocationArtifact
durch,obj.__class__
wobei obj eine Instanz von LocationArtifact ist.Dies ist der falsche Ansatz für Django und erzwingt wirklich Dinge.
Das typische Django-App-Muster lautet:
quelle