Как создать __repr__ из именованного кортежа? - PullRequest
0 голосов
/ 23 декабря 2018

Как создать специальный метод __repr__, где я могу напечатать, например, '6 of spades' или 'Q of diamonds'?

Как получить доступ к данным из namedtuple, помнячто у меня есть list из namedtuple с в self._cards?

import collections

cards = collections.namedtuple('Card', ['rank', 'suit'])

class Deck:
    ranks = [str(n) for n in range (2,11)] + list('JQKA')
    suits = 'spades diamonds hearts clubs'.split()

    def __init__(self):
        self._cards = [cards(rank, suit) for suit in self.suits for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, item):
        return self._cards[item]

    def __repr__(self):
        return '%s of %s' % ()  # <-- don't know how to assign the string

b = ()
for i in b:
    print(i)

Ответы [ 3 ]

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

Было бы понятнее, если бы вы переименовали cards в Card, поскольку это имя, которое вы присвоили этому классу:

Card = collections.namedtuple('Card', ['rank', 'suit'])

Вы можете расширить namedtuple, как и любой другой класс,в том числе дать ему __repr__ метод.Вы даже можете повторно использовать имя класса, поскольку оператор class является типом присваивания:

class Card(Card):
    def __repr__(self):
        return f'{self.rank} of {self.suit}'

Более компактная версия будет

class Card(collections.namedtuple('Card', ['rank', 'suit'])):
    def __repr__(self):
        return f'{self.rank} of {self.suit}'
0 голосов
/ 23 декабря 2018

Вместо этого вы можете использовать typing.NamedTuple, что позволяет вам определять методы обычно:

from typing import NamedTuple

class Card(NamedTuple):
    rank: str
    suit: str
    def __repr__(self):
        return "{} of {}".format(self.rank, self.suit)
0 голосов
/ 23 декабря 2018

Похоже, ваша проблема сейчас заключается в том, что вы пытаетесь создать метод __repr__ внутри своего класса Deck.Этот метод вызывается только тогда, когда вы пытаетесь напечатать Deck объекты, однако кажется, что вместо этого вы пытаетесь напечатать сообщение для одной карты.Вы можете решить эту проблему, создав простой Card класс с костюмом и рангом в качестве переменных класса и сохранив список Card объектов в вашей колоде.Таким образом, вы могли бы написать метод __repr__ для самого класса карты, а также сослаться на масть и ранг карты.

...