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__
).
Ebbene secondo la documentazione si è collegato al uno è per i numeri e uno è per le sequenze – Craicerjack
Si noti che '__concat__' non è un "metodo magico" * * come' __add__' è: https: // docs .python.org/2/reference/datamodel.html – jonrsharpe
* C'è * una differenza, tranne il nome? – user2864740