Was ist der Unterschied zwischen Pythons __add__ und __concat__?

9

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.

    
ArtOfWarfare 18.06.2015, 19:51
quelle

3 Antworten

7

Wenn Sie die Quelle für das operator -Modul überprüfen ( hinzufügen ) , concat ), finden Sie diese Definitionen für diese Funktionen:

%Vor%

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 :

%Vor%

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.

%Vor%

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).

    
poke 18.06.2015, 19:55
quelle
3
  • 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%
  • tatsächlich __add__(a, b) macht nur a + b , daher funktioniert es auch bei Sequenzen.
fferri 18.06.2015 19:54
quelle
0

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%     
Rahul Gupta 18.06.2015 19:59
quelle

Tags und Links