Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用重载比较运算符从int派生类访问原始int比较_Python_Python 2.7_Inheritance_Operator Overloading_Comparison Operators - Fatal编程技术网

Python 使用重载比较运算符从int派生类访问原始int比较

Python 使用重载比较运算符从int派生类访问原始int比较,python,python-2.7,inheritance,operator-overloading,comparison-operators,Python,Python 2.7,Inheritance,Operator Overloading,Comparison Operators,我有一个带有重载比较运算符的int派生类 在重载方法的主体中,我需要使用原始运算符 玩具示例: >>> class Derived(int): ... def __eq__(self, other): ... return super(Derived, self).__eq__(other) 在Python3.3+上运行良好,但在Python2.7上运行失败,出现异常AttributeError:“super”对象没有属性“\uuuuuueq\uuuu

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

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

玩具示例:

>>> class Derived(int):
...     def __eq__(self, other):
...         return super(Derived, self).__eq__(other)
在Python3.3+上运行良好,但在Python2.7上运行失败,出现异常
AttributeError:“super”对象没有属性“\uuuuuueq\uuuu”

我可以想到几个我发现不太干净的步行区:

return int(self) == other
需要创建一个新的
int
对象来比较它,而

try:
    return super(Derived, self).__eq__(other)
except AttributeError:
    return super(Derived, self).__cmp__(other) == 0
基于Python版本分割控制流,我发现这个版本非常混乱(明确检查Python版本也是如此)


如何使用Python2.7和3.3+,以优雅的方式访问原始整数比较?

Python2和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

显然,如果您关心性能,您必须对其余代码进行一些评测,并找出它们中的任何一个是否明显更差……

我认为您应该在定义类之前在
int
中定义
\uuuuueq\uuuuu
。例如:

int = 5
def int.__eq__(self, other):
    return self.real == other
IntDerived = Derived(int)
这应该给
super
类一个
\uuuuu eq\uuuu
属性


编辑


主要的想法奏效了,但我注意到代码不起作用。因此:改进的代码:

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)

两个版本都实现了一个
\uuxor\uxor
方法,您可以尝试以下方法:

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

您可以通过
super.\uuuu eq\uuu
访问
int
比较方法。但是,根据python版本的不同,内置类型比较方法的实现也有很大不同。因此,Python 2<代码> Super .eq 需要1个参数(另一个),而Python 3需要2个(菲利浦和其他),你是否考虑<代码> int(自我)= int(其他)太凌乱?@它创建的对象比<代码> int(自我)=其他< /代码> @ abujaja,你已经考虑过了。很抱歉我认为你假设的开销不是真的。对于任何Python实现来说,不优化内置的整数类型都是疯狂的,例如,每次在某个地方有一个整数时,都要真正实例化一个完整的对象。(也就是说,在继续担心这个优化之前,我会做一些基准测试。)这不是python。@GreenHawk1220如果您将
\uuuuueq\uuuo()
方法放在
派生的
类定义中(并使其在python中工作),我将接受答案。访问
.real
属性的想法是可行的,但代码不是Python。很高兴我提供了帮助。上帝保佑,我喜欢这个答案。虽然不是很干净,但与浮子相比也不起作用。另外,我认为没有必要创建
super
对象,
self
就足够了
self^other
可能更简单。我喜欢后一种方法,但是当
other
是浮点时,它就不起作用了