【问题标题】:How to create a __repr__ of a namedtuple?如何创建一个命名元组的 __repr__?
【发布时间】:2019-05-22 20:15:37
【问题描述】:

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

如何从namedtuple 访问数据,记住我在self._cards 中有namedtuples 中的list

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)

【问题讨论】:

    标签: python python-3.x namedtuple repr


    【解决方案1】:

    您可以改用typing.NamedTuple,它允许您正常定义方法:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2017-07-02
          • 1970-01-01
          • 2017-11-13
          • 2012-10-04
          • 2017-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多