2013-02-27 2 views
5

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?

risposta

4

operatori di confronto do not call __cmp__ se the corresponding magic method o la sua controparte sono definiti e non vi ritornano NotImplemented:

class MyStr(str): 
    def __gt__(self, other): 
     print '(was called)', 
     return int(self) > int(other) 


print MyStr(16) > MyStr(7) # True 

 

PS: Probabilmente non si vuole paragoni innocui buttare eccezioni:

class MyStr(str): 
    def __gt__(self, other): 
     try: 
      return int(self) > int(other) 
     except ValueError: 
      return False 
+0

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

+0

Ahh - Ci andiamo ... ora accettato! – Rocketman

+2

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

Problemi correlati