首页 > 解决方案 > 通过属性检查类的重复实例

问题描述

我正在编写一个创建扑克手的引擎,即使我从多个套牌中抽牌,我也希望每手只包含独特的牌

我的问题是,这段代码

for z in range(dr):
    if self.cards[-1] not in drawcards:
        drawcards[z] = self.cards.pop()

不将花色 x 和值 y 的牌注册为与另一张花色 x 和值 y 的牌相等

这是我的卡类:

class Card:
    """A class containing the value and suit for each card"""
    def __init__ (self, value, suit):
        self.value = value
        self.suit = suit
        self.vname = value_names[value]
        self.sname = suit_names[suit]

    def __str__(self):
        #Irrelevant

    def __repr__(self):
        #Irrelevant

如何使我的程序注册卡 a 与花色 x 和价值 y 等于卡 b 与花色 x 和价值 y?

编辑:对于将来查看这个问题的人来说,除了__eq__,

def __hash__(self):
        return hash((self.value, self.suit))

对于 for 循环中指定的相等性是必需的

标签: pythonoopequality

解决方案


你需要__eq__在你的类上定义来处理比较。这是文档。您可能还想实施__hash__。文档对此进行了更多讨论。

def __eq__(self, other):
    # Protect against comparisons of other classes.
    if not isinstance(other, __class__):
        return NotImplemented

    return self.value == other.value and self.suit == other.suit

推荐阅读