2015-04-13 4 views
0

Я пытаюсь написать метод __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

'if self.r ==" J "или" j ":' всегда будет 'True', потому что' 'j" 'как строка оценивает значение' True'. Вероятно, вы ищете 'if self.r ==" J "или self.r ==" j "'. Кроме того, вместо 'if isinstance (self.r, int) == False', просто скажите' if not 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.r что-то вроде 2 или "Jack" и self.s что-то вроде "Hearts" (если они не уже), а затем вы можете просто определить это:

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

Вот что метод __str__() является должен сделать: вернуть приятное, удобное для человека описание объекта, такого как "2 of Hearts", а не что-то вроде <Card object at 0x0000000002B249B0>.

2

Все ваши обратные заявления что-то порядка

return a == 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" читается как «Возврат 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 
Смежные вопросы