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?
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
Ahh - No to idziemy ... teraz zaakceptowani! – Rocketman
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