2015-04-13 137 views
0

我正在嘗試爲需要排名和套裝的「Card」類編寫__str__方法。我想對於方法採取(例如)「J」返回「傑克」這是我到目前爲止有:爲__str__方法返回布爾值

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

您是否試過返回'str'? –

+0

'如果self.r ==「J」或「j」:'將始終爲'True',因爲字符串的「j」爲「真」。你可能正在尋找'如果self.r ==「J」或self.r ==「j」'。此外,而不是'if isinstance(self.r,int)== False',只要說'if isinstance(self.r,int)'。 – jayelm

+0

您可能誤解了'return'的含義,因爲您正在使用它來爲變量賦值。分配時只需使用'self.s ='Jack''。只有最後一次使用'return'是正確的,即當你真的想離開函數並返回一個值。 –

回答

0

首先,if var == 'a' or 'b'沒有按做你認爲它做的事。它始終是True,因爲非空字符串'b'True

其次,您正在創建不正確的__str__()方法。它需要返回str,而不是bool。這就是爲什麼它告訴你,讓它返回一個bool是一個錯誤。而不是return self.r == "Jack",只是做return "Jack"。更重要的是,你應該做的self.r2"Jack"self.s"Hearts"(如果它們還沒有)的值,然後你可以定義此:

def __str__(): 
    return str(self.r) + ' of ' + self.s 

這就是__str__()方法是什麼應該這樣做:返回一個很好的,人類可讀的對象描述,如"2 of Hearts"而不是像<Card object at 0x0000000002B249B0>之類的東西。

2

你的所有return語句是

return a == b 

順序的東西,所以他們返回True如果等於B,否則爲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] 
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) 
+0

是的,他意外地返回了一個布爾值而不是字符串,但他也在尋找一個完整的卡片名稱 - 所以不只是'返回'傑克'',還包括西裝名稱。 –

+1

哎呀,你是對的。我編輯了我的答案,建議使用本地變量來堅持這一點,直到返回。 – Dan

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"的內容如下:「如果self.r包含"Jack",則返回True;否則,返回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