2016-03-22 7 views
0

Ich lerne OOP in Python und habe versucht, dieses kleine Spiel im OOP-Stil zu laufen, aber aus irgendeinem Grund findet das System die Attribute des Objekts nicht.Ratezahl, kein solches Attribut, Python 3

Hier ist das Problem:

Traceback (most recent call last): 
File "HelloUsername.py", line 47, in <module> 
    newGameGTN = GuessTheNumber() 
File "HelloUsername.py", line 6, in __init__ 
    self.start_game() 
File "HelloUsername.py", line 32, in start_game 
    player = player_choice() 
NameError: name 'player_choice' is not defined 

Auf diesem Code in Python 3:

from random import randint 
class GuessTheNumber(object): 
    """docstring for GuessTheNumber""" 
    def __init__(self): 
     self.start_game() 
     self.player_choice() 
     self.compare_numbers() 

    def player_choice(self): 
     choice = int(input("Choose your number: ")) 
     if choice in range(101): 
       return(choice) 
      else: 
       print("Please enter a number 0-100") 
       player_choice() 

    def compare_numbers(self, computer, player): 
     if player == computer: 
      return(0) 
     elif player > computer: 
      return(1) 
     elif player < computer: 
      return(-1) 

    def start_game(self): 
     computer = randint(0, 100) 
     turn = 0 
     for turn in range(3): 
      player = player_choice() 
      x = compare_numbers(computer, player) 
      print(computer) 
      if x == -1: 
       print("too small") 
      elif x == 1: 
       print("too big")  
      elif x == 0: 
       print("you win") 
       break 
       turn += 1 
      print("game over") 

newGameGTN = GuessTheNumber() 
newGameGTN.start_game() 
+3

Da die Funktionen 'player_choice' und' compare_numbers' innerhalb der Klasse liegen, werden sie intern über das 'self' Objekt weitergegeben. Daher sollte der Aufruf von 'self.player_choice()' funktionieren – jDo

+0

Sie könnten daran interessiert sein, 'classmethod' oder' staticmethod' zu verwenden, da das Objekt nicht wirklich für die Methoden benötigt wird. Sie können [this antwort] (http: // stackoverflow.com/questions/36076506/python3-nameerror-name-method-is-not-defined/36088022#36088022) für eine Beschreibung, wie sie funktionieren, aber jDo habe es genau: Sie müssen 'self.player_choice()' aufrufen statt nur 'player_choice()' –

+0

Was hat das mit Sublime Text zu tun? Bitte markieren Sie Ihren Texteditor nicht, es sei denn, das Problem liegt beim Editor selbst. – MattDMo

Antwort

0

NameError ist nicht die gleiche wie AttributeError (die Sie in der Frage der Zusammenfassung erwähnen). Eine Ausnahme bedeutet, dass der Name, auf den in Ihrem Code verwiesen wird, nicht existiert. Ein Name kann eine lokale Variable oder eine Variable in einem umschließenden Bereich sein.

Alle Methoden in einer Klasse müssen für eine Instanz dieser Klasse aufgerufen werden. (statische Methoden und Klassenmethoden nicht) Statt name = player_choice() müssen Sie name = self.player_choice() schreiben. Dies gilt auch für alle anderen Vorkommen, bei denen Sie eine in der Klasse definierte Methode aufrufen.