0

假设我在 Python 中创建了一个整数包装类,就像 Java 一样。大多数方法都是微不足道的。但是__eq __重载(相等测试)提出了一个有趣的难题:考虑以下方法

def __eq__( self, other ):
    return self.value == int(other)

实施细节:

  • Integer Wrapper 有一个字段“value”,它是一个整数
  • 方法__ trunc __返回字段“值”,以便 int( Integer(x) ) = x
  • Integer 的构造函数将“值”截断为整数;整数(3.1)=整数(3)

方法规则

  1. Integer(x) == Integer(x) 必须对所有整数 x 返回 true
  2. Integer(x) == x 必须为所有整数 x 返回 true
  3. Integer(x) == Integer(y) 必须为所有整数 (x,y) 返回 false 使得 x != y
  4. Integer(x) == y 对于所有 x != y 必须返回 false

我美丽的方法可能会受到最后一次测试的影响。考虑

Integer(1) == 1.1

将返回真。

我们如何在规定的约束下实现一个 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)
4

2 回答 2

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
>>> 
于 2013-08-01T05:38:04.000 回答
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

于 2013-08-01T04:41:25.423 回答