Die richtige Antwort ist 'weder' hasattr bietet Funktionalität, aber es ist möglicherweise die schlechteste aller Optionen.
Wir verwenden die objektorientierte Natur von Python, weil es funktioniert. OO-Analyse ist nie genau und oft verwirrt, aber wir verwenden Klassenhierarchien, weil wir wissen, dass sie Menschen helfen, schneller zu arbeiten. Menschen erfassen Objekte und ein gutes Objektmodell hilft Programmierern, Dinge schneller und mit weniger Fehlern zu ändern. Der richtige Code endet an den richtigen Stellen gruppiert.Die Objekte:
- Kann nur ohne vorhanden ist, die Umsetzung unter Berücksichtigung verwendet werden
- deutlich machen, was geändert werden muss und wo
- Isolate Änderungen einiger Funktionalität von Änderungen auf eine andere Funktionalität - Sie können beheben X ohne zu fürchten, werden Sie Y brechen
hasattr vs isinstance
Having Die Verwendung von "isinstance" oder "hasattr" deutet darauf hin, dass das Objektmodell fehlerhaft ist oder wir es falsch verwenden. Das Richtige ist, das Objektmodell zu reparieren oder zu ändern, wie wir es verwenden. Diese beiden Konstrukte haben die gleiche Wirkung und im Imperativ "Ich brauche den Code, um dies zu tun" sind sie gleichwertig. Strukturell gibt es einen großen Unterschied. Wenn man diese Methode zum ersten Mal (oder nach einigen Monaten anderer Dinge) trifft, vermittelt isinstance einen Reichtum mehr Informationen darüber, was tatsächlich vor sich geht und was sonst noch möglich ist. Hasattr sagt dir nichts.
Eine lange Geschichte der Entwicklung führte uns weg von FORTRAN und Code mit vielen 'Wer bin ich' Schaltern. Wir entscheiden uns dafür, Objekte zu verwenden, da wir wissen, dass sie die Arbeit mit dem Code erleichtern. Wenn wir hasattr wählen, liefern wir Funktionalität, aber nichts ist behoben, der Code ist kaputter als vor dem Start. Wenn wir diese Funktionalität in der Zukunft hinzufügen oder ändern, müssen wir uns mit Code beschäftigen, der ungleich gruppiert ist und mindestens zwei Organisationsprinzipien hat, von denen einige dort sind, wo sie sein sollten, und der Rest zufällig an anderen Orten verteilt ist. Es gibt nichts, was es zusammenhält. Dies ist nicht ein Fehler, sondern ein Minenfeld von möglichen Fehlern, die über jeden Ausführungspfad verstreut sind, der durch Ihren Hasattr passiert.
Also, wenn es eine Wahl ist, ist die Reihenfolge:
- Verwenden Sie das Objektmodell oder es beheben oder zumindest herausfinden, was mit ihm falsch ist und wie man es beheben
- Verwendung isinstance
- Verwenden Sie nicht hasattr
Es gibt Zeiten für alles. Normalerweise versuchen/außer (oder nicht einmal "außer", lassen Sie einfach die Ausnahme perculate den Call-Stack) ist der Weg zu gehen, aber es gibt Ausnahmen (hohoho) für jede Regel. Zum Beispiel teilen Strings und Listen viele Methoden, aber Sie möchten in einem rekursiven Aufruf oft verschiedene Dinge mit ihnen machen. – roippi