Wie kann man wissen, ob ein Objekt ein Attribut in Python hat
-
03-07-2019 - |
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?
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.