Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 制作一副牌,1次迭代后不可调用_Python_Python 3.x - Fatal编程技术网

Python 制作一副牌,1次迭代后不可调用

Python 制作一副牌,1次迭代后不可调用,python,python-3.x,Python,Python 3.x,我是编程新手,尤其是Python,所以我对类一般来说并不太熟悉,但我环顾四周,没有找到任何有用的东西。我定义了卡和牌组的类,在牌组类中,我有一个交易函数,它交易最上面的牌。当代码第一次运行时,每当我尝试处理另一张卡时,程序返回“TypeError:”卡对象不可调用。代码如下: import random deck = [] class Card: def __init__(self, suit, value): self.suit = suit sel

我是编程新手,尤其是Python,所以我对类一般来说并不太熟悉,但我环顾四周,没有找到任何有用的东西。我定义了卡和牌组的类,在牌组类中,我有一个交易函数,它交易最上面的牌。当代码第一次运行时,每当我尝试处理另一张卡时,程序返回“TypeError:”卡对象不可调用。代码如下:

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())”时,程序在处理第一张卡后返回一个错误,当我调试它时,错误只发生在该行。有人知道怎么了吗?提前谢谢

在Deck.deal方法的第一个lin中,通过
Deck[0]
覆盖deal方法。
在Python中,方法只是一种属性,因此它们位于相同的名称空间。

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

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

deal
方法被其自身的第一条语句覆盖。如果您将方法更改为

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

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

调用
deal()
方法会分配给
self.deal
,它与刚才调用的方法同名。再次尝试调用它会调用该卡(因为它不是可调用对象而失败),而不是被重写的原始方法。啊,明白了!我刚刚将self.deal更改为一个新变量,现在它可以工作了。谢谢@jasonharper!