You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类继承含__hash__的基类仍报不可哈希类型TypeError问题排查

子类实例无法哈希的原因与解决方法

问题根源

Python的类继承规则明确:只要子类重写了__eq__方法但未显式定义__hash__,Python会自动将子类的__hash__设为None,哪怕基类已经实现了__hash__。

之所以有这个规则,是因为哈希值必须满足核心约束:相等的对象必须拥有相同的哈希值。你的Subclass重写了__eq__,现在两个Subclass实例相等的条件是x和y完全一致,但基类的__hash__只基于x计算——这会导致Subclass(1,2)和Subclass(1,3)这两个不相等的实例,哈希值却相同,违反了哈希的一致性要求。Python为了避免这种矛盾,直接禁用了子类的哈希能力,所以会抛出TypeError: unhashable type: 'Subclass'。

解决方法

方案1:显式重写__hash__,匹配__eq__逻辑

如果需要Subclass实例可哈希,必须让__hash__的计算逻辑和__eq__保持一致,同时添加类型判断避免跨类错误比较:

class Subclass(Base):
    def __init__(self, x, y):
        super().__init__(x)
        self.y = y
    def __eq__(self, other):
        return isinstance(other, Subclass) and self.x == other.x and self.y == other.y
    def __hash__(self):
        # 基于x和y的元组计算哈希,保证相等实例的哈希值一致
        return hash((self.x, self.y))

方案2:取消__eq__的重写(如果不需要)

如果不需要Subclass用x和y同时判断相等,可以直接继承基类的__eq__方法,这样Python会保留从基类继承的__hash__,子类实例自然可哈希。

内容的提问来源于stack exchange,提问作者Epic Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:25:22