python:0x的类错误__main__.foo实例

时间:2012-08-09 04:54:50

标签: python class function

我正在通过构建一个黑杰克游戏来学习python(具有VBA背景)(是的,我使用二十一点作为示例询问了一堆问题)

这是我的代码:

import random

class DECK():
    def load_deck(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        full_deck = {}
        i = 0
        for s in suite:
            for r in rank:
                full_deck[i] = "%s of %s" % (r, s)
                i += 1
        return full_deck

    def pick_item(self, deck):   
        card_key = random.choice(deck.keys())  
        new_card = deck[card_key] 
        del deck[card_key]  
        return (deck, new_card)

    def missing_card(self, deck):
        temp_deck = DECK()
        print temp_deck

d1 = DECK()

deck1 = d1.load_deck()

deck1, card1 = d1.pick_item(deck1)

print card1

d1.missing_card(d1)

这是我在终端(文件名hand_c.py中得到的内容:

$ python hand_c.py
Ace of Clubs
<__main__.DECK instance at 0x10bb0d248>
$ 

为什么一个功能可以pick_item,而另一个功能missing_card

根据第一个答案,我将函数定义更改为:

    def missing_card(self, deck):
    deckC1 = DECK()
    temp_deck = deckC1.load_deck
    print temp_deck

但现在我从终端获得以下信息:

$ python hand_c.py
Jack of Diamonds
<bound method DECK.load_deck of <__main__.DECK instance at 0x10500e248>>
$ 

2 个答案:

答案 0 :(得分:2)

我修改了你的程序。我介绍了一个构造函数,并将deck的表示形式更改为列表而不是字典,并将其设置为属于您在行d1 = DECK()中创建的卡片组的实例变量。你班上的每一个方法现在都可以访问你的套牌,而不会向世界透露你的套牌的内部表示,你只需要使用一个DECK对象。

import random

class DECK():
    def __init__(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        self.full_deck = []
        for s in suite:
            for r in rank:
                self.full_deck.append("%s of %s" % (r, s))

    def pick_item(self):
        card_key = random.randint(0, len(self.full_deck)-1)  
        new_card = self.full_deck[card_key] 
        del self.full_deck[card_key]  
        return new_card

    def missing_card(self):
        print self.full_deck

d1 = DECK()
card1 = d1.pick_item()

print card1

d1.missing_card()

答案 1 :(得分:1)

你应该通过the Python tutorial。你的代码有很多问题。最基本的是,你正在使用类作为一个包来保存函数,而不是实际上将deck数据作为类实例的一部分。也就是说,您将套牌作为字典返回,然后将其传回另一个函数。最好将牌组存储在一个属性中(例如self.deck),然后让其他函数使用它。

无论如何,它不打印字典的原因很简单。你这样做:

    temp_deck = DECK()
    print temp_deck

因此,您创建一个变量temp_deck并将其设置为类DECK的新实例。然后你打印它。好吧,当然它不会打印字典。 temp_deck不是字典。这是一个DECK对象。如果您想要使用当前代码的字典,则需要像对原始套牌一样进行temp_deck.load_deck(),然后打印出结果。