Como está escrito antes de usar obj.__dict__
puede manejar los casos más comunes, pero algunas clases no tienen el atributo __dict__
y utilizar __slots__
(sobre todo para la eficacia de la memoria).
ejemplo para una forma más resistente de hacer esto:
class A(object):
__slots__ = ('x', 'y',)
def __init__(self, x, y):
self.x = x
self.y = y
class B(object):
def __init__(self, x, y):
self.x = x
self.y = y
def get_object_attrs(obj):
try:
return obj.__dict__
except AttributeError:
return {attr: getattr(obj, attr) for attr in obj.__slots__}
a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')
print(get_object_attrs(a))
print(get_object_attrs(b))
la salida de este código:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Nota 1:
Python es un lenguaje dinámico y siempre es mejor saber la clases que intenta obtener los atributos, ya que incluso este código puede perder algunos casos.
Nota 2:
este código salidas no sólo se incluyen las variables de instancia que significan las variables de clase.por ejemplo:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
salidas de código:
{'path': '/questions'}
Este código no se imprime el atributo url
clase y podría omitir los atributos de la clase buscada.
A veces podríamos pensar que un atributo es un miembro de instancia pero no se muestra ni se mostrará con este ejemplo.
Prácticamente todo el mundo en los nombres de sus clases de Python como 'NewClass'. Puede desafiar las expectativas de las personas si usa una convención de nomenclatura como 'new_class'. –
Aunque es humano-interactivo y no se puede utilizar de forma programática, la función 'help()' ayuda a obtener información sobre clases, funciones, builtins, módulos y más – ytpillai
Pertinente: http://stackoverflow.com/questions/1398022/ looping-over-all-member-variables-of-a-class-in-python –