2017-12-01 15 views
-2

私はuse_potion()という関数でPlayer()クラスを持っています。 IF文でuse_potion()を使用しているとき、最初はうまく動作します。 use_potionの戻り値が変更されると、if文は変更を無視します。ここIFの中でクラス関数を呼び出すと、Trueが返され続けます

コードのセクションの別のモジュールで

class Player(): 
    def __init__(self): 
     inventory = ["potion"] 

    def has_potion(self): 
     return any(item == "Potion" for item in self.inventory): 

from Player import Player 

def available_actions(): 
    moves = ["go east","go west"] 
    if Player().has_potion(): 
     moves.append("use potion") 
    return moves 

Iはavailable_actions(呼び出すとき)、それがすることになっているように、それは3つのすべての動きを返します。しかし、 "ポーション"がPlayer()。inventoryから削除されると、available_actions STILLは "east east"と "go west"ではなく、three moveを返します。 なぜこれが起こっているのか分かりません。

+0

ファイルはStackOverflowのへようこそ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 – Prune

+1

'available_actions'はあなたがそれを呼び出すたびに新しい' Player'インスタンスを作成します。あなたはそれをしたいと思いますか? –

+0

'Player .__ init__'は' inventory'インスタンス属性を作成していません。それはそこのローカル変数であり、それは単に破棄されることになります。 – user2357112

答えて

2

available_actionsに電話するたびに、新しいPlayerがインスタンス化されます。 Playerクラスには薬が含まれているので、常にTrueを返します。

また、init関数でinventoryselfを保存する必要があります。

プレーヤを関数外でインスタンス化し、それをパラメータとして渡す必要があります。

from Player import Player 

my_player = Player() 

def available_actions(player): 
    moves = ["go east","go west"] 
    if player.has_potion(): 
     moves.append("use potion") 
    return moves 

available_actions(my_player) 

とPlayer.pyに

class Player(): 
    def __init__(self): 
     self.inventory = ["potion"] 

    def has_potion(self): 
     return 'potion' in self.inventory 
+0

また、self.inventoryに "potion"を返すだけで、has_potionのコードを簡単にすることができます。そのリストに項目「ポーション」がある場合、これは真と評価されます。 – Tim

+0

良い点。私は調整する – James

+0

Player()クラスを引数として使用していて、それは完璧に機能しました! has_potion関数の変更もうまくいきましたので、ありがとうございます。しかし、これがなぜ機能するのかを理解するために、available_actions関数に引数を追加することによって、そのクラスのインスタンスの代わりにPlayer()クラスが使用されましたか? –

関連する問題