Wie bereits beschrieben, kann obj.__dict__
in den meisten Fällen verwendet werden, aber einige Klassen haben nicht das __dict__
-Attribut und verwenden stattdessen __slots__
(meistens aus Gründen der Speffizienz).
Beispiel für eine robustere Methode, dies zu tun:
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))
Ausgabe dieses Codes:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Hinweis1:
Python ist eine dynamische Sprache und es ist immer besser, die Klassen zu kennen, von denen Sie die Attribute erhalten möchten, da selbst dieser Code einige Fälle übersehen könnte.
Hinweis2:
Dieser Code gibt nur Instanzvariablen aus, das bedeutet, Klassenvariablen werden nicht angezeigt. Zum Beispiel:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
Der Code gibt aus:
{'path': '/questions'}
Dieser Code wird das url
-Klassenattribut nicht ausgeben und könnte gewünschte Klassenattribute auslassen.
Manchmal denken wir, dass ein Attribut ein Instanzattribut ist, aber es ist keins und würde in diesem Beispiel nicht angezeigt werden.
99 Stimmen
Praktisch jeder in Python benennt seine Klassen wie
NewClass
. Du könntest die Erwartungen der Leute herausfordern, wenn du eine Benennungskonvention wienew_class
verwendest.1 Stimmen
Auch wenn es interaktiv für Menschen ist und nicht programmgesteuert verwendet werden kann, hilft die
help()
-Funktion bei der Beschaffung von Informationen über Klassen, Funktionen, integrierte Funktionen, Module und mehr2 Stimmen
Relevant: stackoverflow.com/questions/1398022/…