2443 Stimmen

Wie man weiß, ob ein Objekt ein Attribut in Python hat

Gibt es eine Möglichkeit in Python zu bestimmen, ob ein Objekt ein 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 können Sie feststellen, ob a hat das Attribut property bevor Sie es benutzen?

0 Stimmen

Wenn Sie sagen "feststellen, ob a die Eigenschaft attribut hat, bevor man es benutzt?" wollen Sie eine Funktion, die einen booleschen Wert zurückgibt (wie hasattr() zurückgibt) oder ist es in Ordnung, eine AttributeError Ausnahme?

4 Stimmen

Nennen Sie Ihr Attribut auch nicht wirklich 'Eigenschaft', denn Python hat property Dekorateur und eingebauter und diese sind etwas anders als normale Attribute/Methoden.

3419voto

Jarret Hardie Punkte 89900

Versuchen Sie hasattr() :

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

Ver zweiterlinde's Antwort unten, der gute Ratschläge für die Bitte um Vergebung gibt! Ein sehr pythonischer Ansatz!

Die allgemeine Praxis in Python ist, dass, wenn die Eigenschaft wahrscheinlich die meiste Zeit vorhanden ist, rufen Sie es einfach und entweder lassen Sie die Ausnahme propagieren, oder fangen Sie es mit einem try/except-Block. Dies wird wahrscheinlich schneller sein als hasattr . Wenn die Immobilie wahrscheinlich die meiste Zeit nicht vorhanden ist oder Sie sich nicht sicher sind, sollten Sie hasattr ist wahrscheinlich schneller, als wiederholt in einen Ausnahmeblock zu geraten.

824voto

zweiterlinde Punkte 13917

Als Jarret Hardie beantwortet, hasattr wird den Zweck erfüllen. Ich möchte jedoch hinzufügen, dass viele in der Python-Gemeinschaft die Strategie "leichter um Vergebung zu bitten als um Erlaubnis" (EAFP) und nicht "erst schauen, bevor man springt" (LBYL) empfehlen. Siehe diese Referenzen:

EAFP vs. LBYL (war Re: Bislang etwas enttäuscht)
EAFP vs. LBYL @Code Like a Pythonista: Idiomatisches Python

d. h:

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

... ist vorzuziehen:

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

670voto

Carl Meyer Punkte 113574

Sie können verwenden hasattr() oder fangen AttributeError aber wenn Sie wirklich nur den Wert des Attributs mit einem Standardwert haben wollen, wenn er nicht vorhanden ist, ist die beste Option, einfach getattr() :

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

58voto

batbrat Punkte 5055

Ich denke, was Sie suchen, ist hasattr . Ich würde jedoch etwas wie dieses empfehlen, wenn Sie Folgendes feststellen wollen Python-Eigenschaften -

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

Der Nachteil dabei ist, dass Attributfehler in den Eigenschaften __get__ Code werden ebenfalls erfasst.

Andernfalls, do-

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

Dokumente: http://docs.python.org/library/functions.html
Warnung:
Der Grund für meine Empfehlung ist, dass hasattr keine Eigenschaften erkennt.
Link: http://mail.python.org/pipermail/python-dev/2005-December/058498.html

41voto

Jordan Lewis Punkte 15714

Laut Pydoc ruft hasattr(obj, prop) einfach getattr(obj, prop) auf und fängt Ausnahmen ab. Es ist also genauso gültig, den Attributzugriff mit einer try-Anweisung zu verpacken und AttributeError abzufangen wie die vorherige Verwendung von hasattr().

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

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