Étant donné une classe C en Python, comment puis-je déterminer dans quel fichier la classe a été définie? J'ai besoin de quelque chose qui puisse fonctionner à partir de la classe C ou d'une instance hors C.
La raison pour laquelle je fais cela, c'est parce que je suis généralement fan de mettre des fichiers qui appartiennent ensemble dans le même dossier. Je veux créer une classe qui utilise un modèle Django pour se rendre au format HTML. L'implémentation de base doit déduire le nom de fichier du modèle en fonction du nom de fichier dans lequel la classe est définie.
Disons que je mets une classe LocationArtifact dans le fichier "base / artifacts.py", puis je veux que le comportement par défaut soit que le nom du modèle soit "base / LocationArtifact.html".
la source
Réponses:
Vous pouvez utiliser le module inspect , comme ceci:
la source
getfile
j'ai dû utiliser:inspect.getmodule(C.__class__)
inspect.getfile(C)
. SiC
est une classe, alorsC.__class__
fait référence àobject
, ce qui déclenchera une exceptionTypeError: <module 'builtins' (built-in)> is a built-in class
. Je pense quec
vous ne souhaitez utiliser que pour une instanceinspect.getfile(c.__class__)
.metaclass=abc.ABCMeta
), car elle renvoie à la/usr/local/lib/python3.7/abc.py
place du fichier approprié. La solution de @JarretHardie (ci-dessous) fonctionnait mieux.essayer:
la source
LocationArtifact
parobj.__class__
où obj est une instance de LocationArtifact.C'est la mauvaise approche pour Django et force vraiment les choses.
Le modèle d'application Django typique est:
la source