如何创建一个命名元组的__repr__方法?

7

如何创建特殊方法__repr__,以便我可以打印例如'6 of spades''Q of diamonds'

如何访问namedtuple的数据,同时记住我有一个self._cards中的namedtuple列表?

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个回答

15

如果您将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}'

14
你可以使用typing.NamedTuple,它允许你正常地定义方法:
from typing import NamedTuple

class Card(NamedTuple):
    rank: str
    suit: str
    def __repr__(self):
        return "{} of {}".format(self.rank, self.suit)

1
看起来你现在的问题是,你试图在Deck类内部创建__repr__方法。这种方法只会在尝试打印Deck对象时被调用,但似乎你正在尝试为单个Card打印消息。你可以通过创建一个简单的Card类,将花色和等级作为类变量,并在你的牌堆中存储Card对象列表来解决这个问题。这样,你就可以为卡片类本身编写__repr__方法,并直接引用该卡片的花色和等级。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接