使用重载比较运算符从 int-derived class 访问原始 int 比较

Accessing original int comparison from int-derived class with overloaded comparison operator

我有一个带重载比较运算符的 int 派生 class。

在重载方法的主体中,我需要使用原始运算符。

玩具示例:

>>> class Derived(int):
...     def __eq__(self, other):
...         return super(Derived, self).__eq__(other)

在 Python 3.3+ 上工作正常,但在 Python 2.7 上失败,异常 AttributeError: 'super' object has no attribute '__eq__'.

我可以考虑几个walkarrounds,我发现不是很干净:

return int(self) == other

需要创建一个新的 int 对象来比较它,而

try:
    return super(Derived, self).__eq__(other)
except AttributeError:
    return super(Derived, self).__cmp__(other) == 0

根据 Python 版本拆分控制流,我发现它非常混乱(显式检查 Python 版本也是如此)。

如何使用 Python 2.7 和 3.3+ 优雅地访问原始整数比较?

Python 2 和 3 彼此明显不同,所以我认为您应该硬着头皮检查版本。只有当您尝试编写适用于两者的代码时(根据我的经验,您迟早会发现必须修补的内容),这才是意料之中的。为避免任何性能影响,您可以执行以下操作:

from six import PY2

class Derived(int):
    if PY2:
        def __eq__(self, other):
            return super(Derived, self).__cmp__(other) == 0
    else:
        def __eq__(self, other):
            return super(Derived, self).__eq__(other)

这就是我要做的。如果我真的想继承 int...

如果实在不想,或许可以试试:

class Derived(int):
    def __eq__(self, other):
        return (self ^ other) == 0

显然,如果您关心性能,则必须对其余代码进行一些分析,看看它们中的任何一个是否明显更差...

我认为您应该在定义 class 之前在 int 中定义 __eq__。例如:

int = 5
def int.__eq__(self, other):
    return self.real == other
IntDerived = Derived(int)

这应该给 super class 一个 __eq__ 属性。


已编辑


主要想法可行,但我注意到代码不起作用。所以:改进代码:

class Derived(int):
    def __eq__(self, other):
        return self.real == other

Int = 5
D = Derived(Int)
D.__eq__(4) #Output: False
D.__eq__(5) #Output: True

使用 hasattr 避免创建新的 int 对象、捕获异常或显式检查 Python 版本。

以下代码适用于 Python 2.7 和 3.3+:

class Derived(int):
    def __eq__(self, other):
        return super(Derived, self).__cmp__(other) == 0 if hasattr(Derived, "__cmp__") else super(Derived, self).__eq__(other)

两个版本都实现了一个__xor__方法,你可以试试这个:

class Derived(int):
    def __eq__(self, other):
        return not super(Derived, self).__xor__(other)