如何创建一个命名元组的 __repr__?
Posted
技术标签:
【中文标题】如何创建一个命名元组的 __repr__?【英文标题】:How to create a __repr__ of a namedtuple? 【发布时间】:2019-05-22 20:15:37 【问题描述】:如何创建可以打印的特殊方法__repr__
,例如'6 of spades'
或'Q of diamonds'
?
如何从namedtuple
访问数据,记住我在self._cards
中有namedtuple
s 中的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)
【问题讨论】:
【参考方案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__
方法,并直接引用卡片的花色和等级。
【讨论】:
以上是关于如何创建一个命名元组的 __repr__?的主要内容,如果未能解决你的问题,请参考以下文章