2017-12-01 3 views
-2

Ich habe eine Klasse Player() mit einer Funktion namens use_potion(). Wenn ich use_potion() in einer IF-Anweisung verwende, funktioniert es zunächst gut. Wenn sich der Rückgabewert für use_option ändert, ignoriert die if-Anweisung die Änderung!Aufruf einer Klassenfunktion in einer IF-Anweisung, wird immer True zurückgegeben

Hier ist ein Abschnitt des Codes:

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

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

In einem weiteren Modul:

from Player import Player 

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

Als ich available_actions() aufrufen, es gibt alle drei Züge, wie es soll. Wenn jedoch "Trank" aus dem Player() entfernt wird, gibt available_actions STILL alle drei Züge zurück anstatt nur "gehe nach Osten" und "gehe nach Westen". Ich habe keine Ahnung, warum das passiert.

+0

Willkommen bei Stackoverflow-Datei. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. Wir sollten in der Lage sein, Ihren gesendeten Code in eine Textdatei einzufügen und das beschriebene Problem zu reproduzieren. – Prune

+1

'available_actions' erstellt bei jedem Aufruf eine neue' Player'-Instanz. Bist du sicher, dass du das machen willst? –

+0

'Player .__ init__' erstellt kein Inventory-Attribut; das ist eine lokale Variable, und sie wird einfach verworfen. – user2357112

Antwort

2

Sie stellen bei jedem Anruf Player eine neue Instanz ein available_actions. Da die Klasse Player einen Trank enthält, gibt sie immer True zurück.

Außerdem müssen Sie inventory zu self in Ihrer Init-Funktion speichern.

Sie sollten den Player außerhalb der Funktion instanziieren und ihn dann als Parameter übergeben.

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) 

und in der Player.py

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

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

Beachten Sie auch, Sie können Ihren Code für has_potion einfacher machen, indem Sie einfach "trank" in self.inventory zurückgeben. Dies wird als wahr gewertet, wenn in dieser Liste ein Gegenstand "Zaubertrank" vorhanden ist. – Tim

+0

Guter Punkt. Ich werde anpassen – James

+0

Ich habe die Player() -Klasse als Argument verwendet und es hat perfekt funktioniert! Die Änderung der Funktion has_potion hat auch funktioniert, danke. Aber um sicherzustellen, dass ich verstehe, warum das funktioniert hat, indem ich der Funktion available_actions ein Argument hinzugefügt habe, nahm sie die Player() -Klasse statt einer Instanz dieser Klasse? –

Verwandte Themen