4

IntFieldデータベースからの整数をカプセル化するクラスがあります(実際には関係ありません)。IntFieldを使用して式を評価するために のインスタンスを使用したいと思いますeval

クラスは次のようになります。

class DbField(object):
    def __init__(self, value):
        self.value = value

    def __cmp__(self, other):
        print "comparing {} ({}) with {} ({})".format(self, type(self), other, type(other))
        if type(self.value) == type(other):
            return self.value.__cmp__(other)
        elif type(self) == type(other):
            return self.value.__cmp__(other.value)
        raise ValueError("cannot compare {} and {}".format(type(self), type(other)))

class IntField(DbField):
    def __init__(self, value):
        super(IntField, self).__init__(int(value))

a = IntField(-2)
b = IntField(-2)

print "a=", a
print "b=", b

print "b == -1 ", b == -1
print "b == a ", b == a
print "a == b ", a == b
print "-1 == b ", -1 == b

基本クラスで実現したいのは、カスタム オブジェクトを同じ型の別のカスタム オブジェクトと比較できるようにすることですが、組み込み型と比較することもできます。IntField == IntFieldやができるようになりたいIntField == int

IntField.__cmp__()これらの比較のために最初のオブジェクトが呼び出されることを期待しています。しかし、私は何が起こるかについて困惑していint == IntFieldます。この場合、 のIntField.__cmp__()代わりにメソッドも呼び出されているようintです。組み込み型との比較がどのように機能するかを誰かが説明できますか?

4

0 に答える 0