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

Pio*_*ntk 0 python repr namedtuple python-3.x

如何创建一个特殊的方法__repr__,我可以打印,例如,'6 of spades'还是'Q of diamonds'

如何访问从数据namedtuple,牢记我有一个listnamedtuple以s 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)
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 10

如果您重命名cards为会更清楚Card,因为这是您分配给该类的名称:

Card = collections.namedtuple('Card', ['rank', 'suit'])
Run Code Online (Sandbox Code Playgroud)

您可以namedtuple像任何其他类一样扩展 a ,包括为其提供__repr__方法。您甚至可以重用类名,因为class语句是一种赋值:

class Card(Card):
    def __repr__(self):
        return f'{self.rank} of {self.suit}'
Run Code Online (Sandbox Code Playgroud)

更紧凑的版本是

class Card(collections.namedtuple('Card', ['rank', 'suit'])):
    def __repr__(self):
        return f'{self.rank} of {self.suit}'
Run Code Online (Sandbox Code Playgroud)


Pat*_*ugh 5

您可以typing.NamedTuple改用,这样可以正常定义方法:

from typing import NamedTuple

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


Sam*_*ach 1

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