如何在列表中创建对象的字符串表示?
How to create string representations of objects in a list?
我正在尝试用 Python 创建国王杯游戏(涉及纸牌的饮酒游戏)。就目前而言,当我打印套牌和参与者列表时,控制台似乎正在打印内存地址。我将不胜感激任何帮助、指点、技巧和建议。请和谢谢。
import random
class Participant:
def __init__(self, name, gender):
self.name = name
self.gender = gender
self.cards = []
def drawCard(self):
self.cards += deck.pop()
def showCards(self):
print(self.name)
print(self.cards)
class Card:
def __init__(self, value, suite):
self.value = value
self.suite = suite
def getValue(self):
return self.value
def getSuite(self):
return self.suite
def __str__(self):
return ("{0} of {1}".format(self.value, self.suite))
deck = []
participants = []
def shuffleDeck():
for suite in ["Clubs", "Diamonds", "Hearts", "Spades"]:
for num in ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]:
deck.append(Card(num, suite))
random.shuffle(deck)
return deck
players = input("Enter the number of players: ")
numPlayers = int(players)
if numPlayers < 3:
print(players)
print("Not enough players.")
elif numPlayers > 12:
print(players)
print("That's too many players.")
else:
for player in range(numPlayers):
player += 1
name = input("Player %s's Name: " %player)
gender = input("Player %s's Gender: " %player)
participants.append(Participant(name, gender))
deck = shuffleDeck()
print(deck)
print(participants)
为每个实例定义一个表示。例如:
class Card:
def __init__(self, value, suite):
self.value = value
self.suite = suite
def getValue(self):
return self.value
def getSuite(self):
return self.suite
def __str__(self):
return ("{0} of {1}".format(self.value, self.suite))
def __repr__(self):
return ("{0} of {1}".format(self.value, self.suite))
然后
>> a = [Card(3,'Diamonds'),Card(2,'Spades')]
>> print(a)
[3 of Diamonds, 2 of Spades]
也就是说,请参阅@abarnerts 关于格式化 repr 的评论
Python用指针在内存中存储信息。当你创建一个变量时,你说:哎python,记住这个变量指向的是这块内存。
当您打印字符串或数字时,python 会自动为您设置格式,但是当涉及到更复杂的对象时,它不知道该怎么做。
要通知 python 做什么,您需要创建魔术函数 __str__
(两边各有 2 个下划线),您已经这样做了。
问题是,当您打印列表时,您不会打印每个单独的对象,而是打印列表 代表 每个对象的内容。这样更有用,因为您存储的不是像字符串或整数这样的简单对象,而是复杂且已定义的 结构 .
要告诉 python 代表什么,您需要创建魔术函数 __repr__
。我强烈建议您不要复制 __str__
函数。最好打印类似 Card(*value*, *suite*)
的内容。换句话说:你的初始化函数。
礼包码:
def __repr__(self):
return '{}({}, {})'.format(self.__name__, self.value, self.suite)
我正在尝试用 Python 创建国王杯游戏(涉及纸牌的饮酒游戏)。就目前而言,当我打印套牌和参与者列表时,控制台似乎正在打印内存地址。我将不胜感激任何帮助、指点、技巧和建议。请和谢谢。
import random
class Participant:
def __init__(self, name, gender):
self.name = name
self.gender = gender
self.cards = []
def drawCard(self):
self.cards += deck.pop()
def showCards(self):
print(self.name)
print(self.cards)
class Card:
def __init__(self, value, suite):
self.value = value
self.suite = suite
def getValue(self):
return self.value
def getSuite(self):
return self.suite
def __str__(self):
return ("{0} of {1}".format(self.value, self.suite))
deck = []
participants = []
def shuffleDeck():
for suite in ["Clubs", "Diamonds", "Hearts", "Spades"]:
for num in ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]:
deck.append(Card(num, suite))
random.shuffle(deck)
return deck
players = input("Enter the number of players: ")
numPlayers = int(players)
if numPlayers < 3:
print(players)
print("Not enough players.")
elif numPlayers > 12:
print(players)
print("That's too many players.")
else:
for player in range(numPlayers):
player += 1
name = input("Player %s's Name: " %player)
gender = input("Player %s's Gender: " %player)
participants.append(Participant(name, gender))
deck = shuffleDeck()
print(deck)
print(participants)
为每个实例定义一个表示。例如:
class Card:
def __init__(self, value, suite):
self.value = value
self.suite = suite
def getValue(self):
return self.value
def getSuite(self):
return self.suite
def __str__(self):
return ("{0} of {1}".format(self.value, self.suite))
def __repr__(self):
return ("{0} of {1}".format(self.value, self.suite))
然后
>> a = [Card(3,'Diamonds'),Card(2,'Spades')]
>> print(a)
[3 of Diamonds, 2 of Spades]
也就是说,请参阅@abarnerts 关于格式化 repr 的评论
Python用指针在内存中存储信息。当你创建一个变量时,你说:哎python,记住这个变量指向的是这块内存。
当您打印字符串或数字时,python 会自动为您设置格式,但是当涉及到更复杂的对象时,它不知道该怎么做。
要通知 python 做什么,您需要创建魔术函数 __str__
(两边各有 2 个下划线),您已经这样做了。
问题是,当您打印列表时,您不会打印每个单独的对象,而是打印列表 代表 每个对象的内容。这样更有用,因为您存储的不是像字符串或整数这样的简单对象,而是复杂且已定义的 结构 .
要告诉 python 代表什么,您需要创建魔术函数 __repr__
。我强烈建议您不要复制 __str__
函数。最好打印类似 Card(*value*, *suite*)
的内容。换句话说:你的初始化函数。
礼包码:
def __repr__(self):
return '{}({}, {})'.format(self.__name__, self.value, self.suite)