Dada una clase C en Python, ¿cómo puedo determinar en qué archivo se definió la clase? Necesito algo que pueda funcionar desde la clase C o desde una instancia de C.
La razón por la que estoy haciendo esto es porque generalmente soy un fanático de los archivos que pertenecen juntos a la misma carpeta. Quiero crear una clase que use una plantilla de Django para representarse como HTML. La implementación base debe inferir el nombre de archivo de la plantilla en función del nombre de archivo en el que está definida la clase.
Digamos que puse una clase LocationArtifact en el archivo "base / artifacts.py", luego quiero que el comportamiento predeterminado sea que el nombre de la plantilla sea "base / LocationArtifact.html".
python
class
introspection
Staale
fuente
fuente

Respuestas:
Puede utilizar el módulo de inspección , así:
fuente
getfiletener que usar:inspect.getmodule(C.__class__)inspect.getfile(C). SiCes una clase, entonces seC.__class__refiere aobject, lo que generará una excepciónTypeError: <module 'builtins' (built-in)> is a built-in class. Creo que solocquieres usar una instanciainspect.getfile(c.__class__).metaclass=abc.ABCMeta), ya que devuelve en/usr/local/lib/python3.7/abc.pylugar del archivo apropiado. La solución de @JarretHardie (abajo) funcionó mejor.tratar:
fuente
LocationArtifactconobj.__class__donde obj es una instancia de LocationArtifact.Este es el enfoque incorrecto para Django y realmente forzar las cosas.
El patrón típico de la aplicación Django es:
fuente