制作一副纸牌,经过1次迭代后无法调用

时间:2018-11-26 15:05:35

标签: python python-3.x

我是编程的新手,尤其是Python,所以我对一般的类并不真正熟悉,但是我四处张望,找不到任何有用的东西。我定义了Card和Deck类别,在Deck类别中,有一个交易功能,该交易交易顶牌。代码首次运行时,每当我尝试发行另一张卡时,程序都会返回“ TypeError:'Card对象不可调用”。这是代码:

import random
deck = []


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

    def __repr__(self):
        return "The {} of {}".format(self.value, self.suit)


class Deck:
    def __init__(self):
        suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
        values = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
        for i in suits:
            for j in values:
                deck.append(Card(i, j))

    def __repr__(self):
        return "There are {} cards left in the deck".format(len(deck))

    def shuffle(self):
        if len(deck) == 52:
            random.shuffle(deck)
        else:
            Deck()
            deck.shuffle()

    def deal(self):
        self.deal = deck[0]
        deck.remove(self.deal)
        return self.deal


d1 = Deck()
d1.shuffle()
print(d1.deal())
print(d1.deal())
print(d1)

在第二个“ print(d1.deal())”上,程序在处理了第一张卡后返回错误,并且当我调试它时,该错误仅在该行中发生。有人知道怎么了吗?预先感谢!

3 个答案:

答案 0 :(得分:1)

在Deck.deal方法的第一行中,您用deck[0]覆盖了deal方法。 在Python中,方法只是一种属性,因此它们在相同的名称空间中。

答案 1 :(得分:1)

您正在重写方法。交易功能需要进行以下更改:

def deal(self):
    self.card = deck[0]
    deck.remove(self.card)
    return self.card

答案 2 :(得分:1)

deal方法被其内部的第一条语句覆盖。如果您将方法更改为类似

def deal(self):
    self.top_card = deck[0]
    deck.remove(self.top_card)
    return self.top_card

它将起作用。如果可用,请考虑为您的文本编辑器安装pylint扩展名。它给出了一个有用的错误:“在python第33行中定义的属性隐藏了此方法。”