2009-09-17 7 views
2

Comment parcourir une liste de toutes les classes chargées en mémoire? Je pense à le faire pour une sauvegarde, à la recherche de toutes les classes héritées de db.Model (Google App Engine).Python - Itérer sur toutes les classes

Merci, Neal Walters

Répondre

9

En Python "normal", vous pouvez atteindre tous les objets via la fonction gc.getobjects() du module de bibliothèque standard gc; il est alors très facile de les boucler, en vérifiant lesquels sont des classes (plutôt que des instances ou autre chose - je crois que vous voulez dire instances des classes, mais vous pouvez très facilement obtenir les classes elles-mêmes si c'est vraiment ce que vous voulez), etc.

Malheureusement, le module gc dans App Engine n'implémente PAS getobjects - ce qui rend extrêmement difficile l'accès à TOUTES les classes. Par exemple, une classe créée en appelant:

def makeaclass(): 
    class sic(object): pass 
    return sic 

et caché dans une liste quelque part, IS va être très difficile à atteindre.

Mais heureusement, puisque vous dites dans votre texte de question que vous ne vous préoccupez sous-classes de db.Model, qui est encore plus facile que gc permettrait:

for amodel in db.Model.__subclasses__(): 
    ... 

Assurez-vous que vous ignorez explicitement ces classes vous n'avez pas se soucient, comme Expando ;-).

Notez que cela ne vous donne seulement et exactement les CLASSES, pas les cas - il n'y a pas de raccourci de la même facile si les sont ce que vous êtes vraiment après!

+0

Merci - voir ma réponse avec le code. – NealWalters

2

Les classes sont définies dans les modules. Les modules sont créés par une instruction import.

Les modules sont simplement des dictionnaires. Si vous voulez, vous pouvez utiliser la fonction dir(x) sur un module nommé x

Ou vous pouvez utiliser x.__dict__ sur un module nommé x.

+0

Merci - voir ma réponse avec le code. – NealWalters

0

Basé sur la réponse de S.Lott: Cela fonctionne si j'omets le "if issubclass" sauf que j'obtiens des classes que je ne veux pas.

import dbModels 
    self.response.out.write("<br/><br/>Class Names:</br/>") 
    for item in dbModels.__dict__: 
     if issubclass(item, db.Model): 
     self.response.out.write("<br/>" + item) 

L'erreur ci-dessus donne:

TypeError: issubclass() arg 1 must be a class

Il veut un nom de classe comme parm, pas un nom d'objet apparemment.

Sur la base de la réponse d'Alex, cela a fonctionné grand:

self.response.out.write("<br/><br/>Class Names Inheriting from db.Model:</br/>") 
    for item in db.Model.__subclasses__(): 
     self.response.out.write("<br/>" + item.__name__) 

Merci à tous les deux!

Neal

Questions connexes