Sto cercando di estendere un str
e sovrascrivere il metodo magico __cmp__
. L'esempio seguente mostra che il metodo magico __cmp__
viene mai chiamato quando viene utilizzato >
:Puoi sovrascrivere un metodo magico quando estendi un built-in in python?
class MyStr(str):
def __cmp__(self, other):
print '(was called)',
return int(self).__cmp__(int(other))
print 'Testing that MyStr(16) > MyStr(7)'
print '---------------------------------'
print 'using _cmp__ :', MyStr(16).__cmp__(MyStr(7))
print 'using > :', MyStr(16) > MyStr(7)
quando eseguito comporta:
Testing that MyStr(16) > MyStr(7)
---------------------------------
using __cmp__ : (was called) 1
using > : False
Ovviamente, quando si utilizza il >
sottostante "confronta" funzionalità all'interno viene chiamato anche builtin, che in questo caso è un ordinamento alfabetico.
C'è un modo per ignorare il __cmp__
integrato con metodi magici? E se non puoi direttamente - cosa sta succedendo qui è diverso dai metodi non magici dove puoi?
Grazie! Non avevo mai conosciuto questo piccolo fatto. Ha senso. +1 anche per la velocità di risposta! BTW - Era così veloce - sto ancora aspettando su StackOverflow per permettermi di accettare la risposta (dice che devo aspettare ancora 2 minuti). Com'è per una risposta rapida e preziosa? E 'stato così rapido che non può essere dichiarato valido ancora :) – Rocketman
Ahh - Ci andiamo ... ora accettato! – Rocketman
La chiamata '__cmp __()' può essere forzata per l'operatore '>' sovrascrivendo i metodi ['__lt __()' e '__gt __()' 'str' per restituire' NotImplemented'] (http://ideone.com/ rC5D8v) vale a dire, "se sono definiti altri metodi di confronto magico" nella tua risposta è impreciso. Per coerenza, tutti o nessuno dei metodi dovrebbero essere definiti: '__lt __()', '__gt __()', '__le __()', '__ge __()', '__eq __()', '__ne __()', anche '__hash __()'. – jfs