2009-03-30 6 views
58

É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 peut fonctionner à partir de la classe C, ou d'une instance de C.Comment obtenir le chemin de fichier pour une classe en Python?

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 en HTML. L'implémentation de base doit déduire le nom de fichier pour le modèle basé sur le nom de fichier dans lequel la classe est définie.

Dites que je place un objet LocationArticle dans le fichier "base/artefacts.py", alors je veux que le comportement par défaut soit que le nom du modèle est "base/LocationArtifact.html".

+0

double: http://stackoverflow.com/questions/269795/how-do-i -find-the-location-of-python-module-sources, http://stackoverflow.com/questions/602846/how-can-i-access-the-current-executing-module-or-class-name-in -python –

+0

Ceux-ci supposent que vous connaissez le module que vous recherchez le f ile pour, je vais juste avoir la chaîne de module que je travaille avec des implémentations hors d'une classe. – Staale

Répondre

82

Vous pouvez utiliser le module inspect, comme ceci:

import inspect 
inspect.getfile(C.__class__) 
+3

Je pense que cela fonctionnera pour la classe, mais pas pour une instance. inspect.getfile (c .__ class__) devrait fonctionner, où c est une instance de C. –

+0

Vous avez raison; Je l'avais seulement utilisé sur la classe, et je supposais juste que cela fonctionnerait pour les instances. Merci! – DNS

+0

Je ne savais pas ce que je faisais différemment mais au lieu de 'getfile' je devais utiliser:' inspect.getmodule (C .__ class __) ' – AJP

24

essayer:

import sys, os 
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__) 
5

C'est la mauvaise approche pour Django et forcer les choses vraiment.

Le modèle d'application typique Django est:

  • /projet
    • /appname
      • models.py
      • views.py
      • /templates
        • index.html
        • etc.
+0

+1: Faites ce que Django fait naturellement et la vie est tellement plus simple. –

+0

D'accord. Django est l'un des frameworks avec le moins de "magie", mais les templates, les balises template et les apps ont certaines attentes dans le cadre de leur pattern. Si vous devez faire une inférence de classe farfelue, vous allez probablement dans la mauvaise direction. – Soviut

Questions connexes