假设我在Python中创建了一个整数包装类,就像Java一样。大多数方法都非常简单。但 __ eq __ 重载(相等测试)提出了一个有趣的难题:考虑以下方法
def __eq__( self, other ):
return self.value == int(other)
实施细节:
方法规则
我漂亮的方法很容易受到最后一次测试的影响。考虑
Integer(1) == 1.1
将返回true。
我们如何在规定的约束条件下实现一个Integer类 - 这似乎是微不足道的,具有相当直接的平等定义?
注意:您可能会觉得很难,我声称Integer(1.1)== Integer(1)是一个有效的结果。我承认它有一些愚蠢,但我可以控制构造函数如何处理非整数参数;如果我想声称不安全的演员,我可以抛出异常。我对第四种情况没有任何控制权,其中有人询问我的整数是否等于相同值的原语。
修改 根据请求,这里有足够的代码,我认为我已经提出的条件得到满足:
class Integer:
""" An integer wrapper class. Provides support for using integers as
objects. There are subtelties and pitfalls, however. """
def __init__( self, val = 0 ):
""" Constructs a new integer with a certain value """
self.val = int(val)
def __trunc__( self ):
""" Truncates the internal value """
return int(self.val)
def __eq__( self, other ):
""" Returns true if the object ahs the same value as this object """
return self.val == int(other)
答案 0 :(得分:1)
如果我正确地解释了你的要求,那就应该这样做:
>>> class Integer:
... def __init__(self, val=0):
... self.val = int(val)
... def __eq__(self, other):
... return self.val == other
...
>>> Integer(1) == 1.1
False
>>> Integer(1.2) == Integer(1.3)
True
>>> Integer(4) == Integer(7)
False
>>> Integer(2) == 2
True
>>>
答案 1 :(得分:0)
如果我理解正确,那么这里的问题是你比较的值可能是一个浮点数而不是一个int,反过来,如果与之比较,它会被截断为一个相等的int。
如果是这种情况如何检查,如果比较值有一个余数除以比较值并作出反应:
def __eq__( self, other ):
if float(other) % self.value > 0:
return False
else:
return True
这样你就可以传入一个可以被self.value()整除的浮点数,或者一个整数相同的值,并且对于
的所有情况都返回true int(x) == y || int(x) == int(y) || int(x) == float(y), for all x / y = 1