-1

プログラミング入門クラス用に書いている基本的なアリーナ バトラーの属性エラーについて、簡単な質問があります。プログラムの実行時に問題が発生したコードのチャンクは次のとおりです。

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、今のところ Name Generator は無視してください。私が現在抱えている現在の問題は、IDLE を介してプログラムを実行すると、次のエラーが発生することです。

  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'

私は調査を行い、答えを見つけようとしましたが、「str」エラーの他のすべてのケースにはリストが含まれていたので、プログラムエラーに関するヘルプをいただければ幸いです。前もって感謝します!

4

2 に答える 2

4

明らかに、プレイヤー オブジェクト (パラメーター 'attack'、'defence' など) ではなく、プレイヤー名 (文字列) を使用して、このクラスのコンストラクター (インスタンス化する場所) を呼び出しています。

于 2010-12-15T08:18:29.947 に答える
2

エラーメッセージを読んで理解する方法:

まず、次のように読みます。

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'

最初の行は、問題が発生したときのファイルと行を示しています。2 行目は問題の原因となっている行のコピーであるため、戻って調べなくても確認できます。最後の行は、実際の問題の説明です。

したがって、次のステップは、問題が何であったかを読み取ることです。AttributeError属性を持たないものから属性を取得しようとしたことを意味します。残りは、取得しようとしたもの ( 'str' object、つまり文字列) と取得しようとしたもの ( という名前の属性attack) を示しています。

次に、問題の行を見てみましょう。何かから名前が付けられた属性をどこで取得しようとしますattackか? 明らかに、それは私たちが書いた部分ですplayer.attack。したがって、何が起こったのかがわかります。コードは変数attackから属性を取得しようとしますが、文字列を参照しており、文字列には属性がありません。(明らかに; の とは何ですか? それは意味がありません。)playerplayerattackattack"hi mom"

どうしてそうなった?属性を読み取ろうとするコードを記述した場合attack、明らかにそこにあることを期待していたに違いありません。player文字列にそのような属性があるとは思わないので、他の何かを期待していたときに文字列を入れてしまったというエラーがあります。

値はどのように に入りplayerますか? 関数のパラメーターです。したがって、私たちそれを間違って呼び出し、それを呼び出したコードの行を探しに行き (ヒント: stack-trace の前のエントリを見てください)、周囲のコードを修正します。私たちは何を渡すべきだったのですか?まあ、attack明らかに があるもの。ある種の Player クラスはありましたか? 次に、(プレーヤーの?)名前などではなく、そのインスタンスを渡す必要があります。

于 2010-12-15T10:38:03.233 に答える