python - poo - ¿Cómo listar todos los campos de una clase(y ningún método)?
poo python 3 (5)
Esto debería funcionar para callables:
[f for f in dir(o) if not callable(getattr(o,f))]
Podrías deshacerte del resto con:
[f for f in dir(o) if not callable(getattr(o,f)) and not f.startswith(''__'')]
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.
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, because :
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 programación dinámica que requiere que realice una iteración sobre los campos sin conocer de un objeto, la única manera 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.
Podrías usar el método incorporado vars()
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 declaración 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'']
.
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. Métodos y atributos de clase no están presentes.