объект класса не печатает - PullRequest
1 голос
/ 26 февраля 2020

Мой объект класса не будет напечатан в Python. Вот мой код:

import random

suits = ("Hearts", "Diamonds", "Spades", "Clubs")
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}

playing = True

class Card:

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

    def __str__(self):
        return self.rank + " of " + self.suit

class Deck:

    def __init__(self):
        self.deck = []  # start with an empty list
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit,rank))

    def __str__(self):
        return self.deck

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

    def deal(self):
        pass

test_deck = Deck()
#len(test_deck.deck)
print(test_deck)

Самая последняя строка этого кода print(test_deck) дает мне следующую ошибку, и я не знаю почему, потому что я следую аналогичным примерам, которые используют __str__ для печати класса объект:

    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
      1 test_deck = Deck()
      2 len(test_deck.deck)
----> 3 print(test_deck)

TypeError: __str__ returned non-string (type list)

Я не уверен, почему я не могу напечатать список? Хотя я использовал return

1 Ответ

0 голосов
/ 26 февраля 2020

__str__ метод должен возвращать строковый формат

Вы можете переписать его как

def __str__(self):
    return ", ".join([str(card) for card in self.deck])

Так что он напечатает что-то вроде этого

Two of Hearts, Five of Diamonds

Или если вы Я хочу явно показать, что это структура списка, просто вернуть str(self.deck)

Так что будет напечатано что-то вроде этого

"[<__main__.Card object at 0x7f8ad5a1e190>, <__main__.Card object at 0x7f8ad5a1e190>]"
...