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.

37voto

Maico Punkte 679

Ich möchte vorschlagen, dies zu vermeiden:

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

Der Benutzer @jpalecek hat es erwähnt: Wenn ein AttributeError erfolgt innerhalb doStuff() dann sind Sie verloren.

Vielleicht ist dieser Ansatz besser:

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

24voto

F.M.F. Punkte 1488

hasattr() ist die richtige Antwort. Was ich hinzufügen möchte, ist, dass hasattr() kann auch gut in Verbindung verwendet werden mit behaupten. (zur Vermeidung unnötiger if Anweisungen und machen den Code besser lesbar):

assert hasattr(a, 'property'), 'object lacks property' 
print(a.property)

Falls die Eigenschaft fehlt, wird das Programm mit einer AssertionError und den Ausdruck der bereitgestellten Fehlermeldung ( object lacks property in diesem Fall).

Wie in einem anderen Artikel erwähnt Antwort auf SO :

Asserts sollten verwendet werden, um Bedingungen zu testen, die niemals eintreten sollten. Der Zweck ist, im Falle eines beschädigten Programmzustandes frühzeitig abzustürzen.

Dies ist häufig der Fall, wenn eine Eigenschaft fehlt und dann assert ist sehr angemessen.

24voto

Shashi Punkte 159

Für andere Objekte als dictonary:

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

Für Wörterbuch, hasattr() wird nicht funktionieren.

Viele Menschen raten zur Verwendung von has_key() für Wörterbuch, aber es ist abgeschrieben. Für das Wörterbuch müssen Sie also Folgendes verwenden has_attr()

if a.has_attr('property'):
    a['property']

21voto

nayak Punkte 2431

EDIT Dieser Ansatz hat gravierende Einschränkungen. Er sollte funktionieren, wenn das Objekt ein iterierbar ein. Bitte prüfen Sie die Kommentare unten.

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

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

Ich bin mir jedoch nicht sicher, was im Moment der beste Ansatz ist. hasattr() , mit getattr() oder mit in . Kommentare sind willkommen.

19voto

Alec Punkte 7040

Hier ist ein sehr intuitiver Ansatz:

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

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