如何创建 namedtuple 的 __repr__?
How to create a __repr__ of a namedtuple?
如何创建可以打印的特殊方法 __repr__
,例如 '6 of spades'
或 'Q of diamonds'
?
如何访问 namedtuple
中的数据,记住我在 self._cards
中有 list
个 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)
您现在的问题似乎是您正试图在 Deck
class 中创建 __repr__
方法。该方法只会在您尝试打印 Deck
对象时被调用,但是您似乎正在尝试为单个 Card 打印一条消息。你可以通过制作一个简单的 Card
class 来解决这个问题,其中花色和等级作为 class 变量,并在你的套牌中存储一个 Card
对象的列表。这样你就可以为卡片 class 本身编写一个 __repr__
方法,并直接引用卡片的花色和等级。
如果您将 cards
重命名为 Card
会更清楚,因为这是您分配给 class 的名称:
Card = collections.namedtuple('Card', ['rank', 'suit'])
您可以像扩展任何其他 class 一样扩展 namedtuple
,包括为它提供 __repr__
方法。您甚至可以重用 class 名称,因为 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}'
您可以改用 typing.NamedTuple
,这样您就可以正常定义方法:
from typing import NamedTuple
class Card(NamedTuple):
rank: str
suit: str
def __repr__(self):
return "{} of {}".format(self.rank, self.suit)
如何创建可以打印的特殊方法 __repr__
,例如 '6 of spades'
或 'Q of diamonds'
?
如何访问 namedtuple
中的数据,记住我在 self._cards
中有 list
个 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)
您现在的问题似乎是您正试图在 Deck
class 中创建 __repr__
方法。该方法只会在您尝试打印 Deck
对象时被调用,但是您似乎正在尝试为单个 Card 打印一条消息。你可以通过制作一个简单的 Card
class 来解决这个问题,其中花色和等级作为 class 变量,并在你的套牌中存储一个 Card
对象的列表。这样你就可以为卡片 class 本身编写一个 __repr__
方法,并直接引用卡片的花色和等级。
如果您将 cards
重命名为 Card
会更清楚,因为这是您分配给 class 的名称:
Card = collections.namedtuple('Card', ['rank', 'suit'])
您可以像扩展任何其他 class 一样扩展 namedtuple
,包括为它提供 __repr__
方法。您甚至可以重用 class 名称,因为 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}'
您可以改用 typing.NamedTuple
,这样您就可以正常定义方法:
from typing import NamedTuple
class Card(NamedTuple):
rank: str
suit: str
def __repr__(self):
return "{} of {}".format(self.rank, self.suit)