Como se escribió antes de usar, obj.__dict__
puede manejar casos comunes, pero algunas clases no tienen el __dict__
atributo y usan__slots__
(principalmente para la eficiencia 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))
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 conocer las clases de las que intenta obtener los atributos, ya que incluso este código puede pasar por alto algunos casos.
Nota 2:
este código solo genera variables de instancia, lo que significa que no se proporcionan 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 imprime el url
atributo de clase y puede omitir los atributos de clase deseados.
A veces podríamos pensar que un atributo es un miembro de instancia, pero no lo es y no se mostrará con este ejemplo.
NewClass
. Puede desafiar las expectativas de las personas si usa una convención de nomenclatura comonew_class
.