Python 使用关键字";在;使用类变量和类变量列表

Python 使用关键字";在;使用类变量和类变量列表,python,class,Python,Class,我正在尝试制作一个5张牌的扑克游戏,我正在尝试制作一个card\u draw函数,该函数不提供重复的卡,但是我在尝试检查随机抽取的卡是否已经被抽取时遇到了问题 from random import choice class standard_card: def __init__(self, value, suit): self.value = value self.suit = suit self.card = value + ' of

我正在尝试制作一个5张牌的扑克游戏,我正在尝试制作一个
card\u draw
函数,该函数不提供重复的卡,但是我在尝试检查随机抽取的卡是否已经被抽取时遇到了问题

from random import choice
class standard_card:

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.card = value + ' of ' + suit

def val():
    values = ['Ace','2','3','4','5','6','7','8',
          '9','10','Jack','Queen','King']
    return choice(values)

def suits():
    suit = ['Spades','Hearts','Clubs','Diamonds']
    return choice(suit)

def card_draw(player_hand,nogo):

    for i in range(5):
        draw = standard_card(val(),suits())
        while draw in nogo:
            draw = standard_card(val(),suits())
        player_hand.append(draw)
        nogo.append(draw)
nogo = []
player_hand = []
card_draw(player_hand,nogo)
因此,在
def card\u draw()
中,我只是想确保同一张卡不会被抽两次,这就是为什么我在nogo:中绘制时使用

但是,
在nogo
中绘制时总是
为False
,这意味着有时会将一张重复的卡放入
玩家手中
nogo
。 我不明白为什么
drawinnogo
总是
False
。例如,如果我这样做:

test_card = standard_card('7','Spades')
通过
card\u draw()
生成的
nogo
中的一张卡碰巧也被赋予了值
'7'
'Spades'

test_card in nogo

总是
为False
。有人能解释一下原因吗?

因为您每次都在将一个新实例与
nogo
列表中的其他实例进行比较

你基本上是这样做的:

class A:
    pass

a1 = A()
a2 = A()

print(a1 == a2)

这将始终产生
False

问题是您总是在创建一个新对象。默认情况下,只有当两个Python对象是相同的对象时,它们才是相同的

换句话说,
standard_-card('2','Spades')==standard_-card('2','Spades')
将返回
False

为了让Python知道如何比较两张卡片的相等性,您需要通过实现神奇的方法
\uuuuueq\uuuu

class Card:

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

    def __eq__(self, other):
        return self.value == other.value and self.suit == other.suit

    def __str__(self):
        return self.value + ' of ' + self.suit   
我还实现了
\uu str\uu
方法,因此您可以执行
打印(卡片)
,并根据Python的官方样式指南对其命名



最后,您可能希望实现一个容纳一副牌的
Deck
类。然后,您可以洗牌,并从牌组中连续弹出牌,确保每张牌只能抽取一次。

您还没有告诉Python如何将一张
标准卡与另一张
进行比较。默认情况下,只有当对象是同一个对象时,它们才相等,但事实并非如此。因此Python无法判断卡何时已经在
nogo
中。您必须在类上定义特殊的方法
\uuuu eq\uuu
,才能使
中的
正常工作。