假设我在 Python 中创建了一个整数包装类,就像 Java 一样。大多数方法都是微不足道的。但是__eq __重载(相等测试)提出了一个有趣的难题:考虑以下方法
def __eq__( self, other ):
return self.value == int(other)
实施细节:
- Integer Wrapper 有一个字段“value”,它是一个整数
- 方法__ trunc __返回字段“值”,以便 int( Integer(x) ) = x
- Integer 的构造函数将“值”截断为整数;整数(3.1)=整数(3)
方法规则
- Integer(x) == Integer(x) 必须对所有整数 x 返回 true
- Integer(x) == x 必须为所有整数 x 返回 true
- Integer(x) == Integer(y) 必须为所有整数 (x,y) 返回 false 使得 x != y
- 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)