__str__ python方法问题

时间:2018-06-27 06:13:06

标签: python python-3.x

我正在制作一个python二十一点游戏。我在此代码中有一个错误,无法弄清。最后,当我测试点击功能并打印手时,它不会显示列表。而是显示[<< strong> main .Card对象位于0x02F9F5F0>]。

这是我的代码。

        #Blackjack

import random


suits = ['Clubs', 'Spades', 'Diamonds', 'Hearts']
ranks = ['Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace']
values = {'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5, 'Six': 6, 'Seven': 7, 'Eight': 8, 'Nine': 9, 'Ten': 10, 'Jack': 10, 'Queen': 10, 'King': 10, 'Ace': 11}

game_on = True
class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        return(f'{self.rank} of {self.suit}')


class Deck:

    def __init__(self):
        self.deck = []
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit, rank))

    def __str__(self):
        deck_comp = ''
        for card in self.deck:
            deck_comp += '\n ' + card.__str__()
        return deck_comp

    def shuffle(self):
        random.shuffle(self.deck)

    def deal(self):
        single_card = self.deck.pop()
        return single_card


class Hand:

    def __init__(self):
        self.cards = []  # start with an empty list as we did in the Deck class
        self.value = 0  # start with zero value
        self.aces = 0  # add an attribute to keep track of aces

    def add_card(self, card):
        self.cards.append(card)
        self.value += values[card.rank]
        if card.rank == 'Ace':
            self.aces += 1  # add to self.aces

    def adjust_for_ace(self):
        while self.value > 21 and self.aces:
            self.value -= 10
            self.aces -= 1


class Chips:

    def __init__(self):
        self.total = 100
        self.bet = 0

    def win_bet(self):
        self.chips += self.bet

    def lose_bet(self):
        self.chips -= self.bet





def go_for_bet(chips):
    while True:
        try:
            chips.bet = int(input('Please enter a betting amount: '))
        except TypeError:
            print('Please enter an integer')
            continue
        else:
            if chips.bet > chips.total:
                print(f'You do not have enough chips to bet {chips.bet}')
            else:
                break

def hit(deck, hand):
    hand.add_card(deck.deal())
    hand.adjust_for_ace()

def hit_or_stand(deck, hand):

    while True:
        x = input('Would you like to hit or stand? Say \'h\' or \'s\'')

        if x[0].lower() == 'h':
          hit(deck, hand)

        elif x[0].lower() == 's':
          print('You stand.')

        else:
            print('Try again please')
            continue
        break

deck = Deck()
hand = Hand()

hit(deck, hand)
print(hand.cards)

3 个答案:

答案 0 :(得分:2)

要么:

class Card:
    def __repr__(self):
        return self.__str__()

或先将Card对象转换为字符串:

print([str(x) for x in hand.cards])

答案 1 :(得分:1)

只需使__repr____str__之间的区别更加清晰(:

class Repr:
    def __repr__(self):
        return 'Here I am with __repr__'


class Str:
    def __str__(self):
        return 'Here I am with __str__'

print('Plain:')
print(Repr(), Str())
print('In list:')
print([Repr(), Str()])
  

>

Plain:
Here I am with __repr__ Here I am with __str__
In list:
[Here I am with __repr__, <__main__.Str object at 0x00000216BC2940F0>]

答案 2 :(得分:1)

这是一个班级列表,仅包含一项。您可以打印以下项目:

nx.set_node_attributes(G, count_dict, 'counts')