Comme écrit avant, l'utilisation obj.__dict__
peut gérer les cas courants, mais certaines classes n'ont pas l' __dict__
attribut et l'utilisation __slots__
(principalement pour l'efficacité de la mémoire).
exemple pour une façon plus résiliente de le faire:
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 sortie de ce code:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Remarque 1:
Python est un langage dynamique et il est toujours préférable de connaître les classes dont vous essayez d'obtenir les attributs car même ce code peut manquer certains cas.
Remarque 2:
ce code ne produit que des variables d'instance, ce qui signifie que les variables de classe ne sont pas fournies. par exemple:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
sorties de code:
{'path': '/questions'}
Ce code n'imprime pas l' url
attribut de classe et peut omettre les attributs de classe souhaités.
Parfois, nous pouvons penser qu'un attribut est un membre d'instance, mais il n'est pas et ne sera pas affiché à l'aide de cet exemple.
NewClass
. Vous pouvez défier les attentes des gens si vous utilisez une convention de dénomination commenew_class
.