Das mag albern sein, aber es hat eine Weile in meinem Gehirn gequält.
Python bietet zwei integrierte Möglichkeiten zum Löschen von Attributen aus Objekten: das Befehlswort del und die integrierte Funktion delattr . Ich bevorzuge delattr, weil es meiner Meinung nach etwas expliziter ist:
del foo.bar
delattr(foo, "bar")
Aber ich frage mich, ob es unter der Haube Unterschiede zwischen ihnen geben könnte.
dis
Modul. Sie können es über die Befehlszeile ausführenpython -m dis
und Code eingeben oder eingeben oder eine Funktion mit zerlegendis.dis()
.Betrachten Sie die folgenden Beispiele:
oder:
Mit del geht das nicht .
quelle
del self.__dict__[name]
, vorausgesetzt natürlich, dass mit der Meta-Klasse kein lustiges Geschäft läuftOhne Frage der erstere. Meiner Meinung nach ist das so, als würde man fragen, ob
foo.bar
es besser ist alsgetattr(foo, "bar")
und ich glaube nicht, dass jemand diese Frage stellt :)quelle
if hasattr(obj, 'var') and obj.var == ...
... Ich könnte esif getattr(obj, 'var', None) == ...
in den meisten Fällen einfach auf reduzieren ! Etwas kürzer und leichter zu lesen, denke ich.hasattr
ruft tatsächlich angetattr
Es ist wirklich eine Frage der Präferenz, aber die erste ist wahrscheinlich vorzuziehen. Ich würde den zweiten nur verwenden, wenn Sie den Namen des Attributs, das Sie löschen, nicht im Voraus kennen.
quelle
Genau wie getattr und setattr sollte delattr nur verwendet werden, wenn der Attributname unbekannt ist.
In diesem Sinne entspricht es in etwa mehreren Python-Funktionen, mit denen auf integrierte Funktionen auf einer niedrigeren Ebene zugegriffen wird, als Sie normalerweise zur Verfügung haben, z. B.
__import__
anstelle vonimport
undoperator.add
anstelle von+
quelle
Sie sind sich nicht sicher über das Innenleben, aber aus der Sicht der Wiederverwendbarkeit von Code und ohne die Perspektive eines Idioten, verwenden Sie del. Es ist klarer und verständlicher für Leute, die auch aus anderen Sprachen kommen.
quelle
Wenn Sie der Meinung
delattr
sind, dass dies expliziter ist, warum dann nicht diegetattr
ganze Zeit anstattobject.attr
?Was unter der Haube angeht ... Ihre Vermutung ist so gut wie meine. Wenn nicht wesentlich besser.
quelle
Es ist eine alte Frage, aber ich möchte meine 2 Cent einsetzen.
Obwohl
del foo.bar
es eleganter ist, werden Sie manchmal brauchendelattr(foo, "bar")
. Wenn Sie beispielsweise über eine interaktive Befehlszeilenschnittstelle verfügen, mit der ein Benutzer ein Element im Objekt durch Eingabe des Namens dynamisch löschen kann, haben Sie keine andere Wahl, als das letztere Formular zu verwenden.quelle