549 Stimmen

Auflistung der Attribute eines Objekts

Gibt es eine Möglichkeit, eine Liste von Attributen abzurufen, die auf Instanzen einer Klasse vorhanden sind?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))

Das gewünschte Ergebnis ist, dass "multi, str" ausgegeben wird. Ich möchte dies sehen, um die aktuellen Attribute aus verschiedenen Teilen eines Skripts zu überprüfen.

99 Stimmen

Praktisch jeder in Python benennt seine Klassen wie NewClass. Du könntest die Erwartungen der Leute herausfordern, wenn du eine Benennungskonvention wie new_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 mehr

2 Stimmen

471voto

>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])

Sie können auch pprint hilfreich finden.

44 Stimmen

Die Frage der Verwendung von dict ist gerade auf r/python aufgetaucht. Jemand wies darauf hin, dass vars(a) äquivalent zu a.__dict__ ist.

7 Stimmen

Für den Fall, dass sich jemand wundert, das funktioniert auch auf Python 2.7.

10 Stimmen

Um genau zu sein, pprint.pprint(a.__dict__) führt ein Pretty-Print der Attribute durch.

242voto

Htechno Punkte 5423
dir(Instanz)
# oder (gleicher Wert)
Instanz.__dir__()
# oder
Instanz.__dict__

Dann können Sie mit type() testen, welcher Typ es ist, oder mit callable() überprüfen, ob es sich um eine Methode handelt.

0 Stimmen

Dir funktionierte besser bei Klassen mit überladenen Attributen get/set

1 Stimmen

Dir(instance) listet viele Dinge auf, an denen du wahrscheinlich nicht interessiert bist

1 Stimmen

Dies war die einzige Funktion, die mir alle verfügbaren Attribute des boston Datensatzes von sklearn aufgelistet hat - __dict__ war leer, obwohl es tatsächlich 5 verfügbare Attribute gab.

193voto

grepit Punkte 18534

Alle vorherigen Antworten sind korrekt. Sie haben drei Optionen für das, worum Sie bitten

  1. dir()

  2. vars()

  3. __dict__

    dir(a) ['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'multi', 'str'] vars(a) {'multi': 4, 'str': '2'} a.dict {'multi': 4, 'str': '2'}

15 Stimmen

vars(foo) gibt foo.__dict__ zurück

1 Stimmen

Aber es ist viel lesbarer

95voto

rohithpr Punkte 5612

vars(obj) gibt die Attribute eines Objekts zurück.

45voto

user Punkte 4931

Inspektionsmodul:

Das Inspektionsmodul bietet mehrere nützliche Funktionen, um Informationen über Live-Objekte wie Module, Klassen, Methoden, Funktionen, Tracebacks, Rahmenobjekte und Codeobjekte zu erhalten.


Mit getmembers() können Sie alle Attribute Ihrer Klasse sowie ihren Wert sehen. Um private oder geschützte Attribute auszuschließen, verwenden Sie .startswith('_'). Um Methoden oder Funktionen auszuschließen, verwenden Sie inspect.ismethod() oder inspect.isfunction().

import inspect

class NeueKlasse(object):
    def __init__(self, nummer):
        self.multi = int(nummer) * 2
        self.str = str(nummer)

    def func_1(self):
        pass

inst = NeueKlasse(2)

for i in inspect.getmembers(inst):
    # Ignoriert alles, was mit Unterstrich beginnt
    # (d. h. private und geschützte Attribute)
    if not i[0].startswith('_'):
        # Ignoriert Methoden
        if not inspect.ismethod(i[1]):
            print(i)

Beachten Sie, dass ismethod() auf dem zweiten Element von i verwendet wird, da das erste einfach ein String ist (sein Name).

Offtopic: Verwenden Sie für Klassennamen <a href="https://www.python.org/dev/peps/pep-0008/#class-names" rel="nofollow noreferrer">CamelCase</a>.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X