Python 使用重载比较运算符从int派生类访问原始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
>>> 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
是浮点时,它就不起作用了