Wie vor der Verwendung geschrieben, obj.__dict__
können häufige Fälle behandelt werden, aber einige Klassen verfügen nicht über das __dict__
Attribut und die Verwendung __slots__
(hauptsächlich aus Gründen der Speichereffizienz).
Beispiel für eine belastbarere Vorgehensweise:
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))
Die Ausgabe dieses Codes:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Hinweis 1:
Python ist eine dynamische Sprache und es ist immer besser, die Klassen zu kennen, aus denen Sie die Attribute abrufen möchten, da selbst dieser Code in einigen Fällen fehlen kann.
Hinweis 2:
Dieser Code gibt nur Instanzvariablen aus, dh Klassenvariablen werden nicht bereitgestellt. zum Beispiel:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
Code-Ausgaben:
{'path': '/questions'}
Dieser Code druckt das url
Klassenattribut nicht und lässt möglicherweise die gewünschten Klassenattribute aus.
Manchmal denken wir vielleicht, dass ein Attribut ein Instanzmitglied ist, aber es wird in diesem Beispiel nicht angezeigt und wird auch nicht angezeigt.
NewClass
. Sie können den Erwartungen der Leute trotzen, wenn Sie eine Namenskonvention wie verwendennew_class
.