通过超载比较操作员访问IntDerive类的原始INT比较



我有一个带有超载比较操作员的int衍生类。

在我需要使用原始操作员的主体中。

玩具示例:

>>> 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__'

我可以考虑几个步行路线,我发现这不是很干净:

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

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

两个版本实现了__xor__方法,您可以尝试以下方法:

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

我相信,在定义类之前,您应该在int中定义__eq__。例如:

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

这应该给super类一个__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)

最新更新