面试题答案
一键面试class ImmutablePoint:
def __init__(self, x, y):
self._x = x
self._y = y
# 重写__hash__方法,使对象可哈希,以便能放入集合或作为字典键
def __hash__(self):
return hash((self._x, self._y))
# 重写__eq__方法,用于比较两个对象是否相等
def __eq__(self, other):
if isinstance(other, ImmutablePoint):
return self._x == other._x and self._y == other._y
return False
# 重写__ne__方法,用于比较两个对象是否不相等
def __ne__(self, other):
return not self.__eq__(other)
# 重写__lt__方法,用于小于比较
def __lt__(self, other):
if isinstance(other, ImmutablePoint):
return (self._x, self._y) < (other._x, other._y)
raise TypeError('Unsupported comparison')
# 重写__repr__方法,返回对象的可打印表示,便于调试和开发
def __repr__(self):
return f'ImmutablePoint({self._x}, {self._y})'
解释:
- hash:
- 原因:不可变类型通常需要可哈希,这样才能在集合(如
set
)或字典(作为键)中使用。因为哈希值在这些数据结构中用于快速查找和比较。 - 实际应用:例如在构建一个存储坐标点的集合时,如果坐标点对象不可哈希,就无法将其放入集合中。通过实现
__hash__
方法,可确保相同坐标的点具有相同的哈希值,不同坐标的点具有不同的哈希值,提高集合和字典操作的效率。
- 原因:不可变类型通常需要可哈希,这样才能在集合(如
- eq:
- 原因:用于定义对象之间的相等关系。在不可变类型中,判断两个对象是否相等是非常重要的,特别是在比较操作和数据结构(如集合、字典)中判断元素是否重复时。
- 实际应用:比如在一个包含多个
ImmutablePoint
对象的列表中,判断两个点是否相等,就可以直接使用==
操作符,这依赖于__eq__
方法的实现。
- ne:
- 原因:虽然可以通过
not self.__eq__(other)
实现不等比较,但显式重写__ne__
方法可以提高代码的可读性和性能。 - 实际应用:当需要判断两个对象不相等时,使用
!=
操作符,就会调用__ne__
方法,明确的实现使得代码逻辑更清晰。
- 原因:虽然可以通过
- lt:
- 原因:实现小于比较方法,使得不可变对象可以在支持排序的环境中使用,定义对象之间的大小关系。
- 实际应用:例如对一个包含多个
ImmutablePoint
对象的列表进行排序时,如果定义了__lt__
方法,就可以直接使用列表的sort
方法按照自定义的大小规则进行排序。
- repr:
- 原因:提供对象的可打印表示,方便调试和开发过程中查看对象的状态。在交互式环境中,当输出对象时,
__repr__
方法返回的字符串可以直观地显示对象的内部状态。 - 实际应用:当在调试代码时,打印一个
ImmutablePoint
对象,如果没有__repr__
方法,可能只会得到对象的内存地址等不直观的信息。而实现了__repr__
方法后,就可以清晰地看到点的坐标值。
- 原因:提供对象的可打印表示,方便调试和开发过程中查看对象的状态。在交互式环境中,当输出对象时,