@become_Senior

Как мне вывести список с экземплярами класса?

Здравствуйте! Суть такая: У меня ест класс Card - это игральная карта, и есть класс Deck - колода кард.
Внутри Deck я генерирую все карты колоды и кидаю их в список. Когда задаю экземпляр класса Deck и вывожу его то происходит это """[<__main__.Card object at 0x0000026CFC939E50>, <__main__.Card object at 0x0000026CFC939DD0>, <__main__.Card object at 0x0000026CFC939CD0>, <__main__.Card object at 0x0000026CFC93BB10>,....]
Что мне нужно сделать чтобы выводились данные по карте, ее масть и ценность? [(Черви, Двойка, 2), .....]

suits = ('Червы', 'Бубны', 'Пики', 'Трефы')
ranks = (
    'Двойка', 'Тройка', 'Четвёрка', 'Пятерка', 'Шестёрка', 'Семёрка', 'Восьмёрка', 'Девятка', 'Десятка', 'Валет',
    'Дама',
    'Король', 'Туз')
values = {'Двойка': 2, 'Тройка': 3, 'Четвёрка': 4, 'Пятерка': 5, 'Шестёрка': 6, 'Семёрка': 7, 'Восьмёрка': 8,
          'Девятка': 9, 'Десятка': 10, 'Валет': 10, 'Дама': 10, 'Король': 10, 'Туз': 11}


class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.value = values[rank]

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


# card = Card('Червы', 'Туз')
# print(card)


class Deck:
    def __init__(self):
        self.mydeck = [Card(i, j) for i in suits for j in ranks]

    def __str__(self):
        return f'{self.mydeck}'

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

new_Deck = Deck()
print(new_Deck)
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Добавь классу Card идентичный методу __str__, метод __repr__.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
В питоне есть два метода преобразования в строку: __str__() и __repr__().
Первый преобразует объект в какую-то человекочитаемую строку. Он вызывается, если передать объект в функцию str().
Второй обычно даёт более "техническое" представление объекта - в идеале, он показывает питоновский код, который нужно выполнить, чтобы этот объект получить. Но это требование не строгое, и никто не запрещает в __repr__() показывать что-то другое. Метод вызывается, если передать объект в функцию repr().

Если у объекта нет __str__(), то питон попробует вызвать __repr__(). А __repr__() есть у всех объектов - он наследуется от базового object.

Ты выводишь список целиком. У списка (list) нет метода __str__(), он использует __repr__() - и поэтому пытается вызывать repr() на твоих объектах, а repr() даже не пытается вызвать __str__(), она сразу идёт к __repr__().

Я бы посоветовал переписать метод Deck.__str__() так:
def __str__(self):
        return '[' + (', '.join(str(card) for card in self.mydeck)) + ']'

Тперь он явно вызывает str() на каждой карте, а потому будет использоваться метод Card.__str__().
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы