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
getfile
tener que usar:inspect.getmodule(C.__class__)
inspect.getfile(C)
. SiC
es una clase, entonces seC.__class__
refiere aobject
, lo que generará una excepciónTypeError: <module 'builtins' (built-in)> is a built-in class
. Creo que soloc
quieres usar una instanciainspect.getfile(c.__class__)
.metaclass=abc.ABCMeta
), ya que devuelve en/usr/local/lib/python3.7/abc.py
lugar del archivo apropiado. La solución de @JarretHardie (abajo) funcionó mejor.tratar:
fuente
LocationArtifact
conobj.__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