Comme il est écrit avant d'utiliser obj.__dict__
peut traiter les cas courants, mais certaines classes n'ont pas l'attribut __dict__
et utiliser __slots__
(la plupart du temps pour l'efficacité de la mémoire).
exemple d'une manière plus élastique 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}
Note1:
Python est un langage dynamique et il est toujours préférable de connaître les classes vous essayez d'obtenir les attributs car même ce code peut manquer certains cas.
Note2:
ce code ne sorties variables d'instance qui signifie variables de classe ne sont pas fournis.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'attribut de classe url
et peut omettre les attributs recherchés de classe.
Parfois, nous pourrions penser qu'un attribut est un membre d'instance mais il n'est pas et ne sera pas montré en utilisant cet exemple.
Presque tout le monde dans les noms Python leurs classes comme 'NewClass'. Vous pouvez défier les attentes des gens si vous utilisez une convention de dénomination comme 'new_class'. –
Même s'il est interactif pour l'homme et ne peut pas être utilisé par programmation, la fonction 'help()' aide à obtenir des informations sur les classes, fonctions, builtins, modules et plus encore. – ytpillai
Relevant: http://stackoverflow.com/questions/1398022/ looping-over-all-member-variables-of-a-class-in-python –