2013-02-27 16 views
5

Próbuję przedłużyć str i zastąpić magiczną metodę __cmp__. Poniższy przykład pokazuje, że magiczna metoda __cmp__ nigdy nie jest wywoływana, gdy > jest stosowany:Czy można zastąpić magiczną metodę rozszerzania wbudowanego w 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) 

podczas uruchamiania wyniki:

Testing that MyStr(16) > MyStr(7) 
--------------------------------- 
using __cmp__ : (was called) 1 
using > : False 

Oczywiście w przypadku korzystania z > bazowego „Porównaj” funkcjonalność w ramach wbudowane jest wywołanie, które w tym przypadku jest uporządkowane alfabetycznie.

Czy istnieje sposób na zastąpienie __cmp__ wbudowanego za pomocą magicznych metod? A jeśli nie możesz bezpośrednio - co tu się dzieje, co różni się od metod nie-magicznych, gdzie możesz?

Odpowiedz

4

operatorzy Porównanie do not call __cmp__ jeśli the corresponding magic method lub jego odpowiednik są zdefiniowane i nie wracaj NotImplemented:

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


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

 

PS: Prawdopodobnie nie chcą nieszkodliwe porównań rzucać wyjątki:

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

Dzięki! Nigdy nie znałem tego małego faktu. Ma sens. +1 także za szybkość reakcji! BTW - To było tak szybkie - wciąż czekam na stackoverflow, aby pozwolić mi zaakceptować odpowiedź (mówi, że muszę jeszcze poczekać 2 minuty). Jak to jest w przypadku szybkiej, cennej odpowiedzi? To było tak szybkie, że nie można go jeszcze uznać za cenne :) – Rocketman

+0

Ahh - No to idziemy ... teraz zaakceptowani! – Rocketman

+2

Wywołanie '__cmp __()' może być wymuszone dla operatora '>' przez przesłanianie ['__lt __()' i '__gt __()' '' '' '' '' '' '' '' '' '' '' '' '' '' '_ _ _ _ rC5D8v), tzn. "jeśli jakiekolwiek inne magiczne metody porównywania są zdefiniowane" w Twojej odpowiedzi jest nieprecyzyjne. Aby zachować spójność, należy zdefiniować całą lub żadną z metod: '__lt __()', '__gt __()', '__le __()', '__ge __()', '__eq __()', '__ne __()', także '__hash __()'. – jfs

Powiązane problemy