Python3-如何在重载__truediv__时判断应使用__idiv__还是__div__行为?

时间:2019-10-18 14:32:46

标签: python python-3.x operator-overloading

我正在处理一些处理/解析二进制数据的代码。整数提升是我处理各种整数类型的要求。创建自定义整数类型的结果AND并且由于我想支持python2和python3(不可转让),因此需要重载__div____idiv____truediv__运算符。

但是,在python3.7中,我无法告知为什么 truediv 被调用!示例:

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

    def __div__(self, other):
        print("DIV")
        return self.value / other

    def __idiv__(self, other):
        print("IDIV")
        self.value /= other

    def __truediv__(self, other):
        print("TRUEDIV")
        return self.value / other


test = NewInt(10)
test / 10
test /= 10

如果在python2.7中运行,我得到:

DIV
IDIV

如果在python3.7中运行,我得到:

TRUEDIV
TRUEDIV

如果仅调用__truediv__,我怎么知道何时进行就地分割?

1 个答案:

答案 0 :(得分:2)

您没有实现__itruediv__,它与Python 2的__idiv__等效。

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

    def __truediv__(self, other):
        print("TRUEDIV")
        return self.value / other

    def __itruediv__(self, other):
        print("ITRUEDIV")
        self.value /= other

test = NewInt(10)
test / 10
test /= 10

输出

TRUEDIV
ITRUEDIV