Iterar a través de los miembros de la clase en orden de su statement.

Tuve este problema al escribir un poco de GUI lib que asigna clases a vistas simples de tabla. Cada miembro de clase de un determinado tipo = columna y orden de columnas es importante. Pero…

class Person(object): name = None date_of_birth = None nationality = None gender = None address = None comment = None for member in Person.__dict__.iteritems(): if not member[1]: print member[0] 

salida:

 comment date_of_birth name address gender nationality ... 

ugh, el oder se mezcló todo … salida deseada:

 name date_of_birth nationality gender address comment 

¿Hay una manera de hacerlo sin mantener OrderedDict() adicional de columnas?

Es posible en Python3, mediante el uso de PEP3115, que le permite anular el tipo dict en la metaclase mientras se construye la clase (por ejemplo, para utilizar un OrderedDict que sigue el orden de inserción). Aquí hay una implementación de este enfoque:

 class OrderedMeta(type): @classmethod def __prepare__(metacls, name, bases): return OrderedDict() def __new__(cls, name, bases, clsdict): c = type.__new__(cls, name, bases, clsdict) c._orderedKeys = clsdict.keys() return c class Person(metaclass=OrderedMeta): name = None date_of_birth = None nationality = None gender = None address = None comment = None for member in Person._orderedKeys: if not getattr(Person, member): print(member) 

En Python2, es mucho más complicado. Se podría lograr con algo bastante intrépido como inspeccionar la fuente y elaborar el orden de definición del AST, pero eso probablemente sea mucho más problemático de lo que vale.

Si todo lo que necesita es un agregado de variables, tal vez debería usar un grupo con namedtuple en namedtuple lugar. También mantiene el orden de los campos (ya que es una tupla).

 from collections import namedtuple Person = namedtuple('Person', ('name', 'data_of_birth', 'nationality', 'gender', 'address', 'comment')) print Person._fields 

Ok, no es una respuesta en sí, sino una solución que solo funciona en el contexto de la pregunta original (“Cada miembro de la clase [que es una instancia] de cierto tipo = columna, y el orden de las columnas es importante”). La solución es introducir una variable de clase _count en la clase CertainType e incrementarla en cada instanciación. Después de eso, todos los miembros de la clase de CertainType se empaquetan en una lista que se ordena usando key=attrgetter('_count')

PD: Omitir que la parte “que es una instancia” fue un error de mi parte y tiene una gama limitada de soluciones considerablemente. Lo siento por eso.