我有一个带有超载比较操作员的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)