2010-12-15 72 views
-1

J'ai une brève question concernant une erreur d'attribut concernant un combattant de base de l'arène que j'écris pour mon introduction à la classe de programmation. Voici le morceau de code que je ne parviens pas à avec à l'exécution du programme,AttributeError: l'objet 'str' n'a pas d'attribut 'attack' "'Help!"

class Enemy: 
    def __init__(self,player,weapons,armor): 

     self.name = "Bad Guy" 
     self.health = 100 
     self.attackPower = (player.attack + randint(-5,5)) 
     self.defensePower = (player.defense + randint(-5,5)) 
     self.weapon = player.weapon 
     self.armor = player.armor 
    def name_generator(self): 
     import random 
     element = ["Thunder","Lightning","Wind","Fire", "Stone"] 
     tool = ["Hammer","Drill","Cutter","Knife", "Saw"] 
     randomNumber1 = random.randrange(0,len(element)) 
     randomNumber2 = random.randrange(0,len(tool)) 
     self.randomname = element[randomNumber1] + " " + tool[randomNumber2] 
     return self.randomname 

Lol, ignorer le générateur Nom pour l'instant, thats une idée Je vais essayer de travailler plus tard. Le problème courant que j'ai maintenant est que quand j'exécute le programme par IDLE j'obtiens l'erreur suivante;

File "C:\Users\Caleb Walter\Downloads\Arena_Battler.py", line 150, in __init__ 
    self.attackPower = int(player.attack + randint(-5,5)) 
AttributeError: 'str' object has no attribute 'attack' 

Toute aide serait appréciée sur l'erreur de programme, comme je l'ai fait des recherches et a essayé de trouver la réponse, mais tous les autres casses d'erreur « str » listes impliquées. Merci d'avance!

Répondre

4

Évidemment, vous appelez le constructeur de cette classe (où vous l'instanciez) avec le nom du joueur (chaîne) au lieu d'un objet joueur (avec les paramètres 'attaque', 'défense', etc.).

+0

Merci Max!Alors, comment pourrais-je régler ce problème, Si vous pouviez être si gentil: PA point dans la bonne direction serait suffisant :) –

+0

Je ne serai pas voter-juste parce que je pense que c'est la bonne réponse - depuis, Comme dit l'auteur, c'est «évident». – martineau

+0

@Caleb W .: Prenez un indice de la partie "au lieu d'un objet joueur". – martineau

2

Comment lire et comprendre les messages d'erreur, de sorte que vous pouvez vous aider:

D'abord, nous lisons:

File "C:\Users\Caleb Walter\Downloads\Arena_Battler.py", line 150, in __init__ 
self.attackPower = int(player.attack + randint(-5,5)) 
AttributeError: 'str' object has no attribute 'attack' 

La première ligne dit ce fichier et la ligne que nous étions lorsque le problème eu lieu. La deuxième ligne est une copie de la ligne qui cause le problème, donc nous pouvons le regarder sans avoir à revenir en arrière et à le rechercher. La dernière ligne est une description du problème réel.

Par conséquent, l'étape suivante consiste à lire quel était le problème. AttributeError signifie que nous avons essayé d'obtenir un attribut de quelque chose qui ne l'a pas. Le reste dit quel genre de chose nous avons essayé de l'obtenir (un 'str' object, c'est-à-dire, une chaîne), et ce que nous avons essayé d'obtenir (un attribut nommé attack).

Ensuite, nous regardons la ligne en question. Où essayons-nous d'obtenir un attribut nommé attack à partir de quelque chose? Clairement, c'est la partie où nous avons écrit player.attack. Ainsi, nous savons maintenant ce qui s'est passé: notre code essaie d'obtenir l'attribut attack de la variable player, mais player fait référence à une chaîne, et les chaînes n'ont pas d'attribut attack. (De toute évidence, quel est le attack de "hi mom"? Cela n'a aucun sens.)

Comment est-ce arrivé? Eh bien, si nous écrivons un code qui essaie de lire un attribut attack, il est clair que nous devions nous attendre à ce qu'il soit là. Nous n'attendons pas un tel attribut sur les chaînes, donc l'erreur est que nous avons mis une chaîne dans player quand nous nous attendions à autre chose.

Comment la valeur entre-t-elle dans player? C'est un paramètre à la fonction. Par conséquent, nous appelé à tort, et nous allons trouver la ligne de code où nous l'avons appelé (indice: regarder l'entrée précédente dans la pile-trace), et de corriger le code environnant. Qu'allions-nous faire passer? Eh bien, quelque chose qui a un attack, évidemment. Avez-vous eu une sorte de classe de joueur? Ensuite, vous devriez passer une instance de cela, plutôt qu'un nom (du joueur?) Ou autre chose.

+0

Merci Karl, c'est probablement la meilleure explication du problème que j'ai vu, très clair et instructif! J'ai résolu le problème et tout fonctionne bien maintenant! –