Die Liste der Standardoperatoren von Python enthält sowohl __add__(a, b)
als auch __concat__(a, b)
. Beide werden normalerweise von a + b
aufgerufen. Meine Frage ist, was ist der Unterschied zwischen ihnen? Gibt es ein Szenario, in dem man eher verwendet wird als das andere? Gibt es einen Grund, warum Sie beide für ein einzelnes Objekt definieren würden?
Hier ist die Dokumentation Ich habe die Methoden gefunden, die in erwähnt wurden.
Bearbeiten: Hinzufügen zu der Seltsamkeit ist diese Dokumentation :
Schließlich sollten Sequenztypen Addition (dh Verkettung) und Multiplikation (dh Wiederholung) implementieren, indem Sie die unten beschriebenen Methoden
__add__()
,__radd__()
,__iadd__()
,__mul__()
,__rmul__()
und__imul__()
definieren. Sie sollten nicht__coerce__()
oder andere numerische Operatoren definieren.
Wenn Sie die Quelle für das operator
-Modul überprüfen ( hinzufügen ) , concat ), finden Sie diese Definitionen für diese Funktionen:
Es gibt also eigentlich keinen Unterschied, außer dass concat
tatsächlich einen Sequenztyp benötigt. Beide Funktionen verwenden den Operator +
. Dieser Effekt hängt von den hinzugefügten Typen ab.
Im Allgemeinen ist die Verwendung des Moduls operator
in den meisten Fällen nicht sehr hilfreich. Das Modul wird hauptsächlich verwendet, wenn Sie eine Funktion übergeben müssen, die eine Operation ausführt, z. B. für funktionale Funktionen wie %. co_de% , map
oder filter
. Aber normalerweise können Sie einfach den Operator reduce
direkt verwenden.
Wie für die Unterstreichungsfunktionen ( +
und __add__
) sind dies nur Aliase :
Aber diese sind natürlich nicht mit den speziellen Methoden verwandt, die zum Überladen von Operatoren verwendet werden für benutzerdefinierte Typen. Sie sind Funktionen, die denselben Namen wie diese speziellen Methoden haben, wahrscheinlich, damit sie ähnlich aussehen. Beachten Sie, dass es keine spezielle __concat__
-Methode für Objekte gibt.
Die Implementierung von __concat__
für einen benutzerdefinierten Typ wirkt sich jedoch auf die Funktionsweise der Operatormodulfunktionen aus, z. B.
Wie Sie sehen, verwendet __add__
die Implementierung der speziellen Methode operator.add
; Der Grund dafür ist, dass die Implementierung von Example.__add__
nur den Operator operator.add
verwendet (welches Verhalten wird explizit durch die spezielle Methode +
definiert).
operator.__add__(a, b)
: Rückgabe a + b
, für a
und b
Zahlen *. operator.__concat__(a, b)
: Rückgabe a + b
für a
und b
Sequenzen . Was ist der Unterschied?
Sie können beispielsweise keine Ganzzahlen verketten:
%Vor%__add__(a, b)
macht nur a + b
, daher funktioniert es auch bei Sequenzen. Wie in der Dokumentation,
operator.__add__(a, b)
Gibt a + b zurück, für a und b Zahlen.
operator.__concat__(a, b)
Gibt a + b für a und b Sequenzen zurück.
operator .__ add __ (a, b):
Es wird nur versucht, a + b
auszuführen und das Ergebnis zu geben.
ZB
%Vor%operator .__ concat __ (a, b):
Hier wird überprüft, ob a
das Attribut __getitem__
hat. Wenn es nicht __getitem__
-Attribut hat, löst es eine Exception aus, dann versuchen Sie a + b
durchzuführen.
ZB
Wenn Sie diese Operationen für Zahlen ausführen, wird eine Ausnahme ausgelöst.
%Vor%Wenn es an zwei Strings ausgeführt wird, führt es eine String-Verkettung durch.
%Vor%