2015-06-18 7 views
8

L'elenco degli operatori standard di Python include sia __add__(a, b) sia __concat__(a, b). Entrambi sono solitamente invocati da a + b. La mia domanda è, qual è la differenza tra loro? C'è uno scenario in cui uno sarebbe usato piuttosto che l'altro? C'è qualche ragione per definire entrambi su un singolo oggetto?Qual è la differenza tra __add__ e __concat__ di Python?

Ecco il documentation ho trovato metodi citati nei

Edit. Aggiungendo alla stranezza è questa documentation:

Infine, i tipi di sequenze dovrebbe implementare l'addizione (intendendo la concatenazione) e la moltiplicazione (ripetizione significato) definendo i metodi __add__(), __radd__(), __iadd__(), __mul__(), __rmul__() e __imul__() descritti di seguito; non dovrebbero definire __coerce__() o altri operatori numerici.

+0

Ebbene secondo la documentazione si è collegato al uno è per i numeri e uno è per le sequenze – Craicerjack

+2

Si noti che '__concat__' non è un "metodo magico" * * come' __add__' è: https: // docs .python.org/2/reference/datamodel.html – jonrsharpe

+0

* C'è * una differenza, tranne il nome? – user2864740

risposta

7

Se si controlla la fonte per il modulo operator (add, concat), troverete queste definizioni per queste funzioni:

def add(a, b): 
    "Same as a + b." 
    return a + b 

def concat(a, b): 
    "Same as a + b, for a and b sequences." 
    if not hasattr(a, '__getitem__'): 
     msg = "'%s' object can't be concatenated" % type(a).__name__ 
     raise TypeError(msg) 
    return a + b 

quindi, non c'è alcuna differenza se non che concat in realtà richiede una sequenza genere. Entrambe le funzioni utilizzano l'operatore +, il cui effetto dipende dai tipi aggiunti.

In generale, l'utilizzo dello operator module non è molto utile la maggior parte del tempo. Il modulo viene utilizzato principalmente quando è necessario passare una funzione che esegue un'operazione, ad esempio a funzioni funzionali come map, filter o reduce. Ma di solito, puoi usare direttamente l'operatore +.

Per quanto riguarda le funzioni di sottolineatura (__add__ e __concat__), questi sono just aliases:

__add__ = add 
__concat__ = concat 

Ma quelli sono, naturalmente, non legati alla special methods utilizzato sovraccaricare gli operatori per i tipi personalizzati.Sono funzioni che hanno lo stesso nome di quei metodi speciali, probabilmente per farle sembrare simili. Si noti che non esiste alcun metodo speciale sugli oggetti __concat__.

Implementazione __add__ su un tipo personalizzato sarà comunque influenzare il modo l'operatore funzioni del modulo di lavoro, ad esempio:

>>> class Example: 
     def __init__ (self, x): 
      self.x = x 
     def __repr__ (self): 
      return 'Example({})'.format(self.x) 
     def __add__ (self, other): 
      return Example(self.x + other.x) 

>>> a = Example(2) 
>>> b = Example(4) 
>>> operator.add(a, b) 
Example(6) 
>>> a + b 
Example(6) 

Come si può vedere, operator.add utilizzerà l'applicazione del metodo speciale Example.__add__; ma la ragione è che l'implementazione di operator.add utilizza semplicemente l'operatore + (il cui comportamento è esplicitamente definito dal metodo speciale __add__).

+0

beh, il modulo 'operator' è utile per passare l'operatore a' riduci() ' – fferri

+1

@mescalinum Ecco cosa ho scritto: *" Il modulo è utilizzato principalmente quando è necessario passare una funzione che esegue un'operazione. "* – poke

+0

ok. Mi è piaciuto menzionare 'reduce()' perché la programmazione funzionale è così bella :) – fferri

3
  • operator.__add__(a, b): Rientro a + b, per a e bnumeri *.
  • operator.__concat__(a, b): Rientro a + b per a e bsequenze.

Qual è la differenza?

Ad esempio, non è possibile concatenare interi:

>>> operator.__concat__(2,3) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: 'int' object can't be concatenated 

  • realtà __add__(a, b) fa solo a + b, quindi funziona su sequenze troppo.
0

Come da documentazione,

operator.__add__(a, b) ritorno a + b, di A e B numeri.

operator.__concat__(a, b) Restituisce a + b per le sequenze a e b.

operatore .__ aggiungere __ (a, b):

sarà solo provare a eseguire a + b e dare il risultato.

Es.

operator.__add__(1,2) # performs 1 + 2 
3 

operator.__add__('a','b') # performs 'a'+'b' 
'ab' 

operatore .__ concat __ (a, b):

Qui, verificherà se a ha attributo __getitem__. Se non ha l'attributo __getitem__, solleva un'eccezione altrimenti prova a eseguire a + b.

Es.

Quando si eseguono queste operazioni sui numeri, si genera un'eccezione.

operator.__concat__(1,2) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError:'int' object can't be concatenated 

Se eseguito su due stringhe, esegue concatenazione di stringhe.

operator.__concat__('a','b') 
'ab' 
+0

Il comportamento * in realtà * differisce/limita? 'operator.add (" a "," b ")' produce il risultato atteso ('" a "+" b "=>" ab "') e la documentazione dice che entrambi "Return a + b". – user2864740

+0

Nota che OP stava parlando dei moduli 'operator', non di metodi speciali. Si noti inoltre che non esiste un metodo speciale '__concat__'. – poke

+0

ha aggiornato gli ans. –