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 kann man feststellen, ob a
das Attribut property
hat, bevor man es benutzt?
Versuchen Sie hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Siehe zweiterlinde's answer weiter unten, der einen guten Ratschlag über 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, man sie einfach aufruft und entweder die Ausnahme weiterlaufen lässt oder sie mit einem try/except-Block einfängt. Das wird wahrscheinlich schneller sein als hasattr
. Wenn die Eigenschaft wahrscheinlich die meiste Zeit nicht vorhanden ist oder man sich nicht sicher ist, ist die Verwendung von hasattr
wahrscheinlich schneller, als wiederholt in einen Ausnahmeblock zu geraten.
Ich denke, was Sie suchen, ist hasattr. Allerdings würde ich etwas wie dieses empfehlen, wenn Sie python Eigenschaften- erkennen wollen.
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Der Nachteil dabei ist, dass auch Attributfehler im __get__
-Code der Eigenschaften abgefangen werden.
Andernfalls, do-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Docs: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
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