¿Cómo listar todos los campos de una clase (y ningún método)?

Supongamos que o es un objeto de Python, y quiero todos los campos de o , sin ningún método o __stuff__ . ¿Cómo se puede hacer esto?

He intentado cosas como:

 [f for f in dir(o) if not callable(f)] [f for f in dir(o) if not inspect.ismethod(f)] 

pero estos devuelven lo mismo que dir(o) , presumiblemente porque dir da una lista de cadenas. Además, cosas como __class__ serían devueltas aquí, incluso si esto funciona.

Puede obtenerlo a través del atributo __dict__ , o la función vars incorporada, que es solo un acceso directo:

 >>> class A(object): ... foobar = 42 ... def __init__(self): ... self.foo = 'baz' ... self.bar = 3 ... def method(self, arg): ... return True ... >>> a = A() >>> a.__dict__ {'foo': 'baz', 'bar': 3} >>> vars(a) {'foo': 'baz', 'bar': 3} 

Solo hay atributos del objeto. Los métodos y atributos de clase no están presentes.

La respuesta básica es “no se puede hacer de manera confiable”. Vea esta pregunta .

Puede obtener una aproximación con [attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))] .

Sin embargo, no debes confiar en esto, porque :

Debido a que dir() se proporciona principalmente como una conveniencia para el uso en una solicitud interactiva, trata de proporcionar un conjunto interesante de nombres más de lo que trata de proporcionar un conjunto de nombres definido de manera rigurosa o consistente, y su comportamiento detallado puede cambiar entre las versiones.

En otras palabras, no hay una forma canónica de obtener una lista de “todos los atributos de un objeto” (o “todos los métodos de un objeto”).

Si está realizando algún tipo de progtwigción dinámica que requiere que realice una iteración sobre los campos sin conocer de un objeto, la única forma confiable de hacerlo es implementar su propia forma de realizar un seguimiento de esos campos. Por ejemplo, podría usar una convención de nomenclatura de atributos, un objeto especial de “campos” o, simplemente, un diccionario.

Esto debería funcionar para callables:

 [f for f in dir(o) if not callable(getattr(o,f))] 

Podrías deshacerte del rest con:

 [f for f in dir(o) if not callable(getattr(o,f)) and not f.startswith('__')] 

Puede iterar a través del atributo __dict__ una instancia y buscar cosas que no sean de método.
Por ejemplo:

 CALLABLES = (types.FunctionType, types.MethodType) for key, value in A().__dict__.items(): if not isinstance(value, CALLABLES): print key 

Salida:

 foo bar 

Puede hacerlo en una sola statement con una lista de comprensión:

 print [key for key, value in A.__dict__.items() if not isinstance(value, CALLABLES)] 

Lo que imprimiría ['foo', 'bar'] .

Podría usar el método incorporado vars()