Python自定义speelkaart类__gt__运算符重载出现TypeError的原因
问题:Python扑克牌类重载
__gt__运算符时出现TypeError的原因 我在Python中创建了代表扑克牌的speelkaart类,该类包含花色(colour)和牌值(value)属性,牌值排序规则为列表[2,3,4,5,6,7,8,9,10,'B','V','K','A']。我希望重载__gt__运算符实现卡牌大小比较,规则是根据牌值在排序列表中的索引判断大小。但调用__gt__进行卡牌比较时出现TypeError,而在类外部使用相同的列表索引比较逻辑却能正常运行,现附上代码请求明确报错原因:
class speelkaart(): def __init__(self,colour,value): self.value = value self.colour = colour list = [2,3,4,5,6,7,8,9,10,'B', 'V', 'K', 'A'] def __repr__(self): return f"""speelkaart({self.colour},{self.value})""" def __eq__(self, n): if isinstance(n,speelkaart): if self.value == n.value and self.colour== n.colour: return True else: return False return NotImplemented def __gt__(self, n): if isinstance(n,speelkaart): if list.index(self.value) > list.index(n.value): return True else: return False return NotImplemented kaart1 = speelkaart(1,5) kaart2 = speelkaart(1,5) kaart3 = speelkaart(2,3) kaart4 = speelkaart(1,'B') print(kaart1 == kaart2) print(kaart1 == kaart3) print(kaart1 > kaart3) # print(kaart4 > kaart1) list = [2,3,4,5,6,7,8,9,10,'B', 'V', 'K', 'A'] print(f"""kaart1 has a value of {kaart1.value} and has a ranking of {list.index(kaart1.value)} kaart4 has a value of {kaart4.value} and has a ranking of {list.index(kaart4.value)}""") print(f"""so why do I get an TypeError in the __gt__(self,other) if i compare it with the list.index(self.waarde) and list.index(other.waarde)""") print(list.index(kaart1.value) > list.index(kaart4.value))
报错原因分析
局部变量作用域限制
你在__init__方法内定义的list是局部变量,仅在__init__内部有效,__gt__方法无法访问这个变量。当__gt__中调用list.index(...)时,Python会尝试查找全局作用域的list。全局变量定义时机滞后
代码中全局的list是在执行print(kaart1 > kaart3)之后才定义的,此时执行比较操作时,全局list尚未存在,会触发NameError(你看到的TypeError可能是测试其他场景时的衍生错误,但核心问题是作用域)。变量命名冲突风险
用list作为变量名会覆盖Python内置的list类型,可能引发其他隐性问题,建议避免使用内置类型名作为变量名。
修正后的代码
将牌值排序列表定义为类属性,确保所有类方法都能访问,同时优化命名避免冲突:
class speelkaart(): # 定义为类属性,所有实例和方法均可访问 VALUE_RANKING = [2,3,4,5,6,7,8,9,10,'B', 'V', 'K', 'A'] def __init__(self, colour, value): self.value = value self.colour = colour def __repr__(self): return f"speelkaart({self.colour},{self.value})" def __eq__(self, n): if isinstance(n, speelkaart): return self.value == n.value and self.colour == n.colour return NotImplemented def __gt__(self, n): if isinstance(n, speelkaart): self_rank = self.VALUE_RANKING.index(self.value) other_rank = self.VALUE_RANKING.index(n.value) return self_rank > other_rank return NotImplemented kaart1 = speelkaart(1,5) kaart2 = speelkaart(1,5) kaart3 = speelkaart(2,3) kaart4 = speelkaart(1,'B') print(kaart1 == kaart2) # 输出 True print(kaart1 == kaart3) # 输出 False print(kaart1 > kaart3) # 输出 True print(kaart4 > kaart1) # 输出 True print(f"""kaart1 has a value of {kaart1.value} and has a ranking of {speelkaart.VALUE_RANKING.index(kaart1.value)} kaart4 has a value of {kaart4.value} and has a ranking of {speelkaart.VALUE_RANKING.index(kaart4.value)}""") print(speelkaart.VALUE_RANKING.index(kaart1.value) > speelkaart.VALUE_RANKING.index(kaart4.value)) # 输出 False
内容的提问来源于stack exchange,提问作者Kain
相关产品推荐
相关产品推荐

