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

38voto

SilentGhost Punkte 285785
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

Natürlich werden dadurch alle Methoden oder Attribute in der Klassendefinition gedruckt. Sie können "private" Methoden ausschließen, indem Sie i.startwith('__') zu i.startwith('_') ändern

19voto

Jason Angel Punkte 1960

Sie können dir(Ihr_Objekt) verwenden, um die Attribute zu erhalten und getattr(Ihr_Objekt, Ihr_Objekt_Attribut) um die Werte zu erhalten.

Verwendung :

für att in dir(Ihr_Objekt):
    print(att, getattr(Ihr_Objekt, att))

Dies ist besonders nützlich, wenn Ihr Objekt kein __dict__ hat. Wenn das nicht der Fall ist, können Sie auch var(Ihr_Objekt) ausprobieren

12voto

Michael Ekoka Punkte 17537

Es wird oft erwähnt, dass man für eine vollständige Liste der Attribute dir() verwenden sollte. Beachten Sie jedoch, dass im Gegensatz zur populären Meinung dir() nicht alle Attribute auflistet. Zum Beispiel könnte Ihnen auffallen, dass __name__ in der Liste von dir() einer Klasse fehlt, obwohl Sie darauf von der Klasse selbst aus zugreifen können. Aus der Dokumentation zu dir() (Python 2, Python 3):

Weil dir() in erster Linie als Bequemlichkeit für die Verwendung an einer interaktiven Eingabeaufforderung konzipiert ist, versucht es, eine interessante Auswahl von Namen bereitzustellen, anstatt streng definierte oder konsistent definierte Namen bereitzustellen, und sein detailliertes Verhalten kann sich zwischen den Versionen ändern. Zum Beispiel sind Metaklassenattribute nicht in der Ergebnisliste enthalten, wenn das Argument eine Klasse ist.

Eine Funktion wie die folgende neigt dazu, vollständiger zu sein, obwohl keine Garantie für Vollständigkeit besteht, da die Liste, die von dir() zurückgegeben wird, von vielen Faktoren beeinflusst werden kann, einschließlich der Implementierung der Methode __dir__() oder der Anpassung von __getattr__() oder __getattribute__() in der Klasse oder einem ihrer Elternteile. Weitere Details finden Sie in den bereitgestellten Links.

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)

10voto

Jeff Silverman Punkte 644

Es gibt mehr als eine Möglichkeit, es zu tun:

#! /usr/bin/env python3
#
# Dies demonstriert, wie man die Attribute eines Objekts auswählt

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )

Wenn dieser Code ausgeführt wird, ergibt sich:

jeffs@jeff-desktop:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

jeffs@jeff-desktop:~/skyset$

8voto

Mike Graham Punkte 68846

Wofür brauchst du das? Es könnte schwierig sein, dir die beste Antwort zu geben, ohne dein genaues Ziel zu kennen.

  • Es ist fast immer besser, dies manuell zu machen, wenn du eine Instanz deiner Klasse auf eine bestimmte Weise anzeigen möchtest. Dies beinhaltet genau das, was du willst und nicht das, was du nicht willst, und die Reihenfolge wird vorhersagbar sein.

    Wenn du eine Möglichkeit suchen, den Inhalt einer Klasse anzuzeigen, formatiere die Attribute, die dich interessieren, manuell und übergebe dies als Methode __str__ oder __repr__ für deine Klasse.

  • Wenn du erfahren möchtest, welche Methoden und ähnliches für ein Objekt existieren, um zu verstehen, wie es funktioniert, verwende help. help(a) zeigt dir eine formatierte Ausgabe über die Klasse des Objekts basierend auf seinen Docstrings.

  • dir existiert, um alle Attribute eines Objekts programmgesteuert zu erhalten. (Der Zugriff auf __dict__ macht meiner Meinung nach etwas ähnliches, was ich selbst nicht verwenden würde.) Dies könnte jedoch nicht die Dinge enthalten, die du willst, und es könnte Dinge enthalten, die du nicht willst. Es ist unzuverlässig und die Leute denken, dass sie es viel öfter haben wollen als sie es tatsächlich tun.

  • Zu einem etwas orthogonalen Thema: Es gibt sehr wenig Unterstützung für Python 3 zu diesem Zeitpunkt. Wenn du daran interessiert bist, echte Software zu schreiben, wirst du Drittanbieter-Tools wie numpy, lxml, Twisted, PIL oder eine beliebige Anzahl von Web-Frameworks wollen, die Python 3 noch nicht unterstützen und auch keine Pläne haben, dies bald zu tun. Die Unterschiede zwischen 2.6 und dem 3.x-Zweig sind gering, aber der Unterschied in der Bibliotheksunterstützung ist enorm.

5 Stimmen

Ich möchte nur darauf hinweisen, dass ich glaube, dass alle von Ihnen genannten Drittanbieter-Module fünf Jahre später (jetzt) python3 unterstützen. Quelle: python3wos.appspot.com

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