¿Cómo iterar a través de cada statement de clase, descendiente de una clase base particular?

Estaba vagando, ¿cómo el elixir \ sqlalchemy llega a conocer todas las clases de entidades que he declarado en mi modelo, cuando llamo a setup_all() ? Necesito ese tipo de funcionalidad en un pequeño proyecto mío, pero no tengo ni idea. Intenté recorrer el setup_all() elixir y descubrí que mantiene una colección de todas las clases de entidades en una lista “global” (¿o fue dictada?), Pero no puedo detectar el momento en que la lista es lleno. ¿Algunas ideas?

Respondiendo la pregunta principal, sin tratar con SQLALchemy o elixir en absoluto, sí, es posible en Python.

El módulo recolector de basura ( gc ) en la biblioteca estándar, tiene una función de llamada que permite recuperar todas las referencias a un objeto determinado, en todo el intérprete. Siempre se hace referencia a una clase en el atributo __mro__ de cualquier clase heredada.

Por lo tanto, la siguiente función podría recuperar todas las clases que heredan de una clase dada:

 import gc def find_subclasses(cls): all_refs = gc.get_referrers(cls) results = [] for obj in all_refs: # __mro__ attributes are tuples # and if a tuple is found here, the given class is one of its members if (isinstance(obj, tuple) and # check if the found tuple is the __mro__ attribute of a class getattr(obj[0], "__mro__", None) is obj): results.append(obj[0]) return results 

Para las definiciones de clase, esto es más fácil (sin importar)

 def find_subclasses(cls): results = [] for sc in cls.__subclasses__(): results.append(sc) return results 

No estoy seguro si querías esto, u objetos. Si quieres objetos:

 import gc def find_subclasses(cls): results = [] for sc in cls.__subclasses__(): for obj in gc.get_objects(): if isinstance(obj, sc): results.append(obj) return results