Frage

Gibt es eine Möglichkeit in Python, um zu bestimmen, ob ein Objekt etwas Attribut hat? Zum Beispiel:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

Wie kann man sagen, wenn a das Attribut property hat es vor der Verwendung?

War es hilfreich?

Lösung

Versuchen Sie hasattr() :

if hasattr(a, 'property'):
    a.property

EDIT: Siehe zweiterlinde Antwort unten, der etwa um Vergebung zu bitten gute Ratschläge bietet! Ein sehr pythonic Ansatz!

Die allgemeine Praxis in Python ist, dass, wenn die Eigenschaft wahrscheinlich ist es die meiste Zeit zu sein, ist es einfach anrufen und entweder lassen die Ausnahme propagieren, oder Trap es mit einem Try / außer Block. Dies wird wahrscheinlich schneller als hasattr. Wenn die Eigenschaft wahrscheinlich nicht da sein die meiste Zeit, oder Sie sind nicht sicher, hasattr verwendet, wird wahrscheinlich schneller sein, als immer wieder in einen Ausnahmeblock fallen.

Andere Tipps

Wie Jarret Hardie antwortete hasattr den Trick. Ich möchte aber hinzufügen, dass viele in der Python-Gemeinschaft eine Strategie empfehlen „einfacher, um Vergebung zu bitten, als um Erlaubnis“ (EAFP) eher als „aussehen, bevor Sie springen“ (LBYL). Sehen Sie diese Referenzen:

EAFP vs. LBYL @code wie ein Pythonista: Idiomatic Python

ie:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... ist bevorzugt an:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

Sie können mit hasattr() oder fangen AttributeError, aber wenn Sie wirklich nur den Wert des Attributs mit einem Standard wollen, wenn sie nicht da ist, ist die beste Option nur zu verwenden, getattr() :

getattr(a, 'property', 'default value')

Ich denke, was Sie suchen ist hasattr . Allerdings würde ich so etwas wie dies empfehlen, wenn Sie auf Python Eigenschaften erkennen wollen -

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

Der Nachteil hierbei ist, dass Attribut Fehler in den Eigenschaften __get__ Code wird auch gefangen.

Ansonsten tun -

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

Text & Tabellen: http://docs.python.org/library/functions.html
Achtung:
Der Grund für meine Empfehlung ist, dass hasattr nicht Eigenschaften erkennt.
Link: http://mail.python.org/pipermail/python -dev / 2005-Dezember / 058498.html

Nach pydoc, hasattr (obj, Prop) ruft einfach getattr (obj, prop) und Ausnahmen abfängt. Also, es ist genauso gültig das Attribut Zugriff mit einer try-Anweisung und fangen Attributen zu wickeln, wie es zu benutzen hasattr ist () vorher.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

Ich möchte vermeiden vorschlagen dies:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

Der Benutzer @jpalecek erwähnt: Wenn ein AttributeError innerhalb doStuff() auftritt, sind Sie verloren

.

Vielleicht ist dieser Ansatz besser:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)

Je nach Situation können Sie mit isinstance überprüfen, welche Art von Objekt, das Sie haben, und dann die entsprechenden Attribute verwenden. Mit der Einführung von abstrakten Basisklassen in Python 2.6 / 3.0 hat dieser Ansatz auch viel mächtiger geworden (im Grunde ABCs ermöglichen eine anspruchsvollere Art und Weise der Ente eingeben).

Eine Situation, waren dies nützlich wäre, wenn zwei verschiedene Objekte ein Attribut mit dem gleichen Namen, aber mit anderer Bedeutung. führen könnte dann auf seltsame Fehler nur hasattr verwenden.

Ein schönes Beispiel ist die Unterscheidung zwischen Iteratoren und Iterables (siehe diese Frage). Die __iter__ Methoden in einem Iterator und ein iterable haben die gleichen Namen, aber semantisch ganz anders! So hasattr ist nutzlos, aber isinstance zusammen mit ABC bietet eine saubere Lösung.

Allerdings habe ich damit einverstanden, dass in den meisten Fällen der hasattr Ansatz (in anderen Antworten beschrieben) ist die am besten geeignete Lösung.

Hoffnung erwarten Sie hasattr (), aber versuchen hasattr zu vermeiden () und bitte lieber getattr (). getattr () schneller als hasattr ()

mit hasattr ():

 if hasattr(a, 'property'):
     print a.property

hier gilt das gleiche i getattr bin mit Immobilien zu erhalten, wenn es keine Eigenschaft ist es keine Rückkehr

   property = getattr(a,"property",None)
    if property:
        print property

Bearbeiten : Dieser Ansatz hat ernsthafte Einschränkung. Es sollte funktionieren, wenn das Objekt eine ist iterable ein. Bitte überprüfen Sie die Kommentare unten.

Wenn Sie mit Python 3.6 oder höher wie ich gibt es eine bequeme Alternative zu prüfen, ob ein Objekt ein bestimmtes Attribut hat:

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

Allerdings bin ich mir nicht sicher, was der beste Ansatz ist jetzt. mit hasattr(), mit getattr() oder mit in. Kommentare sind willkommen.

Hier ist ein sehr intuitiver Ansatz:

if 'property' in dir(a):
    a.property

Sie können prüfen, ob object Attribut enthält von hasattr builtin-Methode.

Für eine Instanz, wenn Ihr Objekt ist a und Sie möchten für Attribut stuff überprüfen

>>> class a:
...     stuff = "something"
... 
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

die Methodensignatur selbst ist hasattr(object, name) -> bool das bedeutet, wenn object hat Attribut was zweites Argument in hasattr übergeben wird, als es boolean True oder False nach dem Vorhandensein von name Attribute in Objekt gibt.

Diese super einfach, nur verwenden dir( Objekt )
Dies wird eine Liste von jeder verfügbaren Funktion und Eigenschaft des Objekts.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top