Conforme escrito antes de usar, obj.__dict__
pode lidar com casos comuns, mas algumas classes não têm o __dict__
atributo e o uso __slots__
(principalmente para eficiência de memória).
exemplo para uma maneira mais resiliente de fazer isso:
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))
saída deste código:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Nota1:
Python é uma linguagem dinâmica e é sempre melhor conhecer as classes das quais você está tentando obter os atributos, pois mesmo esse código pode perder alguns casos.
Nota2:
esse código gera apenas variáveis de instância, o que significa que variáveis de classe não são fornecidas. por exemplo:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
saídas de código:
{'path': '/questions'}
Este código não imprime o url
atributo de classe e pode omitir os atributos de classe desejados.
Às vezes, podemos pensar que um atributo é um membro da instância, mas não é e não será mostrado usando este exemplo.
NewClass
. Você pode desafiar as expectativas das pessoas se usar uma convenção de nomes comonew_class
.