5

を拡張してstr、マジックメソッドをオーバーライドしようとしています__cmp__。次の例は、が使用されたときにマジックメソッド__cmp__が呼び出されないことを示しています。>

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)

実行結果:

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

明らかに、>ビルトイン内の基礎となる「比較」機能を使用すると、呼び出されます。この場合は、アルファベット順です。

__cmp__ビルトインをマジックメソッドでオーバーライドする方法はありますか?そして、あなたが直接できない場合-あなたができる非魔法の方法とは異なるここで何が起こっているのですか?

4

1 に答える 1

4

対応するマジックメソッドまたはその対応するメソッドが定義されている場合、比較演算子は呼び出さ__cmp__れず、次を返しません。NotImplemented

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


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

 

PS:おそらく、無害な比較で例外をスローしたくないでしょう。

class MyStr(str):
    def __gt__(self, other):
        try:
            return int(self) > int(other)
        except ValueError:
            return False
于 2013-02-27T19:47:50.343 に答える