我正在尝试为“卡片”类编写__str__
方法,该类采用等级和套装。我想方法采取(例如)“j”返回“杰克”这是我到目前为止:
def __init__(self,rank,suit):
'''Rank represents the number on the card (Ace-King). Suit represents the type on each card
(Hearts,Diamonds,Spades,Clubs)'''
self.r = rank
self.s = suit
def __str__(self):
'''Creates a string for appropriate display of cards'''
if isinstance(self.r,int) == False:
if self.r == "J" or "j":
return self.r == "Jack"
if self.r == "Q" or "q":
return self.r == "Queen"
if self.r == "K" or "k":
return self.r == "King"
if self.r == "A" or "a":
return self.r == "Ace"
if self.s == "D" or "d":
return self.s == "Diamonds"
if self.s == "H" or "h":
return self.s == "Hearts"
if self.s == "S" or "s":
return self.s == "Spades"
if self.s == "C" or "c":
return self.s == "Clubs"
return str(self.r) + " " + "of" + " " + str(self.s)
我的回复是:TypeError: __str__ returned non-string (type bool)
答案 0 :(得分:2)
您的所有退货声明都是
的顺序return a == b
因此,如果a等于b,则返回True,否则返回False。每当遇到return
语句时,它将从函数返回而不执行任何其他操作。
我不太确定你想要达到的目标,但这并不是要削减它。
也许是这样的:
def __init__(self, rank, suit):
self.r = str(rank).lower()
self.s = suit.lower()
assert(self.r in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'j', 'q', 'k', 'a'])
assert(self.s in ['d', 's', 'c', 'h'])
def __str__(self):
'''Creates a string for appropriate display of cards'''
rank_converter = {
'j': 'Jack',
'q': 'Queen',
'k': 'King',
'a': 'Ace'
}
for i in range(1, 11):
rank_converter[str(i)] = str(i)
suit_converter = {
'd': 'Diamonds',
'h': 'Hearts',
's': 'Spades',
'c': 'Clubs'
}
return rank_converter[self.r] + ' of ' suit_converter[self.s]
答案 1 :(得分:1)
你发现了一些错误:
if self.r == "J" or "j"
和类似的行并不意味着“如果self.r
包含"J"
或"j"
”。 Python会将其解析为:if (self.r == "J") or ("j")
- 两个独立的条件。第二个条件始终为True
,因为任何非空字符串(例如"j"
)都会转换为True
。你真正想要的是if self.r == "J" or self.r == "j"
。return self.r == "Jack"
读作:“如果True
包含self.r
,则返回"Jack"
;否则,返回False
。”你不想在这里归还任何东西。以下代码应该正常工作,并且希望可读且易懂。看看你是否可以按照每条线说的话。
def __str__(self):
'''Creates a string for appropriate display of cards'''
if not isinstance (self.r, int): # Cleaner than '== False'
if self.r == "J" or self.r == "j":
r = "Jack"
elif self.r == "Q" or self.r == "q":
r = "Queen"
elif self.r == "K" or self.r == "k":
r = "King"
elif self.r == "A" or self.r == "a":
r = "Ace"
else:
r = str(self.r)
if self.s == "D" or self.s == "d":
s = "Diamonds"
elif self.s == "H" or self.s == "h":
s = "Hearts"
elif self.s == "S" or self.s == "s":
s = "Spades"
elif self.s == "C" or self.s == "c":
s = "Clubs"
return r + " of " + s
答案 2 :(得分:0)
首先,if var == 'a' or 'b'
没有按照您的想法行事。它始终为True
,因为非空字符串'b'
为True
。
其次,您正在创建一个不正确的__str__()
方法。它需要返回str
,而不是bool
。这就是为什么它告诉你让它返回bool
是一个错误。而不是return self.r == "Jack"
,只需return "Jack"
。更好的是,您应该将self.r
的值设置为2
或"Jack"
和self.s
,例如"Hearts"
(如果它们尚未存在),以及那么你可以定义一下:
def __str__():
return str(self.r) + ' of ' + self.s
这就是__str__()
方法应该做的事情:返回一个很好的,人类可读的对象描述,如"2 of Hearts"
,而不是<Card object at 0x0000000002B249B0>
。
答案 3 :(得分:0)
您希望(例如)return "Jack"
代替return self.r == "Jack"
。前者返回一个字符串,后者(你正在做的)返回thing == thing
的结果,这是一个布尔值。
if self.r in ["J", "j"]:
rank = "Jack"
etc.
if self.s in ["D", "d"]:
suit = "Diamonds"
etc.
return str(rank) + " " + "of" + " " + str(suite)