返回__str__方法的布尔值

时间:2015-04-13 00:57:53

标签: python class methods boolean

我正在尝试为“卡片”类编写__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)

4 个答案:

答案 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)