Как использовать метод __str__ для печати списка? - PullRequest
0 голосов
/ 06 декабря 2018
class Deck:

    def __init__(self):
        self.cards=[]
        for suit in range(4):
            for rank in range(1,14):
                card=Card( suit, rank )
                self.cards.append(card)

    def __str__ (self):
        res=[]
        for card in self.cards:
            res.append(str(card))

        return '\n'.join(res)

    def pick_card(self):
        from random import shuffle
        shuffle(self.cards)
        return self.cards.pop()

    def add_card(self,card):
        if isinstance(card, Card): #check if card belongs to card Class!!
            self.cards.append(card)

    def move_cards(self, gen_hand, num):
        for i in range(num):
            gen_hand.add_card(self.pick_card())


class Hand(Deck):

    def __init__(self, label=''):
        self.cards = []
        self.label = label

    def __str__(self):
        return 'The {} is composed by {}'.format(self.label, self.cards)

mazzo_uno = Decks()
hand = Hand('New Hand')
mazzo_uno.move_cards(hand, 5)
print(hand)

Я пытаюсь освоить объектно-ориентированное программирование.У меня есть эта проблема, когда я пытаюсь напечатать объект hand из подкласса Hand ().Я напечатал что-то вроде этого <<strong> main .Card объект в 0x10bd9f978> вместо правильного строкового имени 5 карт в списке self.cards:

The New Hand is composed by [<__main__.Card object at 0x10bd9f978>, 
<__main__.Card object at 0x10bd9fd30>, <__main__.Card object at 0x10bd9fe80>, 
<__main__.Card object at 0x10bcce0b8>, <__main__.Card object at 0x10bd9fac8>]

Я пытался также сделать это, чтобы преобразовать self.cards в строку, но я получил "TypeError: sequence item 0: expected str instance, Card found".

def __str__(self):
    hand_tostr = ', '.join(self.cards)
    return 'The {} is composed by {}'.format(self.label, hand_tostr)

Я читал на других ответах на этом сайте, что я должен использовать __repr__, но я не сделалпонять, как добавить его в класс Hand.

1 Ответ

0 голосов
/ 06 декабря 2018

__repr__ и __str__ служат различным целям, но работают одинаково.

Вы можете прочитать это , чтобы помочь вам выбрать один из двух методов.


Вы можете изменить метод __str__ класса Hand следующим образом:

class Hand:

    def __str__(self):
        hand_tostr = ', '.join(map(str, self.cards)) # I use map to apply str() to each element of self.cards
        return 'The {} is composed by {}'.format(self.label, hand_tostr) 

Если вы хотите изменить метод __repr__ класса Card, вы можете попробовать что-то вродеэто (вы не предоставили код для класса Card)

class Card:
    #your code

    def __repr__(self):
        return <some string>

Теперь, если вы сделаете str(<list of Card objects>), он будет использовать метод __repr__ на каждом экземпляре карты для отображения того, что вы хотите.Я не большой поклонник этого решения, для вашего случая я бы использовал первое, так как вы можете сохранить представление карты по умолчанию для других случаев.


Будьте осторожны с этим кодом:

def add_card(self,card):
    if isinstance(card, Card): #check if card belongs to card Class!!
        self.cards.append(card)

Вы ничего не поднимаете, если карта не является экземпляром карты.Это означает, что если вы используете этот метод с неправильным параметром, ошибка будет скрыта, и вы не будете знать, что колода не изменилась.Это довольно опасно.Вместо этого вы можете сделать что-то вроде этого:

def add_card(self,card):
    assert(isinstance(card, Card)), "card parameter of add_card must be an instance of Card class"
    self.cards.append(card)

В более питоническом ключе вы можете использовать typehint , чтобы проинформировать пользователя ваших классов о том, что карта должна быть экземпляром карты.Затем доверьтесь стилю Python по типу утки или используйте такие инструменты, как mypy , чтобы убедиться, что метод используется правильно.

...