Ich habe geschrieben Software mit erheblichen Mengen von Überlastung, und in letzter Zeit bedaure ich, dass die Politik. Ich würde das sagen:
Überlasten Sie nur Betreiber, wenn es die natürliche, erwartete Sache zu tun ist und keine Nebenwirkungen hat.
Also, wenn Sie eine neue RomanNumeral
Klasse machen, macht es Sinn, Addition und Subtraktion usw. zu überlasten Aber es nicht überlastet werden, es sei denn es natürlich ist: es macht keinen Sinn für ein Car
oder ein Vehicle
Objekt Addition und Subtraktion zu definieren .
Eine andere Faustregel: nicht überladen ==
. Es macht es sehr schwer (wenn auch nicht unmöglich), tatsächlich zu testen, ob zwei Objekte gleich sind. Ich habe diesen Fehler gemacht und für eine lange Zeit bezahlt.
Wie für die Überlastung +=
, ++
etc, würde ich eigentlich sagen: nur zusätzliche Betreiber überlasten, wenn Sie eine große Nachfrage nach dieser Funktionalität haben. Es ist einfacher, einen Weg zu haben, etwas als fünf zu machen. Sicher, es bedeutet manchmal, dass Sie x = x + 1
anstelle von x += 1
schreiben müssen, aber mehr Code ist in Ordnung, wenn es klarer ist.
Im Allgemeinen, wie mit vielen "ausgefallenen" Funktionen, ist es leicht zu denken, dass Sie etwas wollen, wenn Sie nicht wirklich, eine Menge Zeug implementieren, die Nebenwirkungen nicht bemerken, und dann später herausfinden. Err auf der konservativen Seite.
EDIT: Ich wollte eine Erläuterung über Überladung ==
hinzufügen, weil es scheint, verschiedene Kommentatoren missverstehen dies, und es hat mich erwischt. Ja, is
existiert, aber es ist eine andere Operation. Angenommen, ich habe ein Objekt x
, das entweder aus meiner benutzerdefinierten Klasse stammt oder eine ganze Zahl ist. Ich möchte sehen, ob x
ist die Nummer 500. Aber wenn Sie x = 500
gesetzt, dann später Test x is 500
, werden Sie False
, aufgrund der Art und Weise Python Caches Zahlen bekommen. Mit 50
würde es True
zurückgeben. Aber man kann nicht is
verwenden, da Sie x == 500
wollen vielleicht True
zurück, wenn x
eine Instanz der Klasse ist. Verwirrend? Bestimmt. Aber das ist die Art von Details, die Sie verstehen müssen, um Operatoren erfolgreich zu überlasten.
BTW, für diejenigen verzweifelt an der gedacht, um% nicht für die String-Formatierung zu haben: Obwohl die Python 3-Dokumentation% als veraltet beschreibt, ist sie immer noch dokumentiert und es scheint keine Chance zu geben, dass die Funktion bis Python 4, basierend auf den letzten Diskussionen in python-dev, wirklich verschwindet. Das lässt viel Zeit, um die neue String-Format-Methode, die bereits in 2.6 verfügbar ist, zu lernen und zu lieben. –
Die Format-Funktion ist viel besser als% jemals war – Casebash