2016-11-25 3 views
1

Ich erstelle ein textbasiertes Abenteuer in Python. Ich habe zwei Bücher über Python fertig und nehme einen Online-Kurs, also denke ich, dass ich wirklich alle Grundlagen habe.ungebundener Methodenfehler - Textbasiertes Abenteuer

Jetzt erstelle ich gerade meine Artikel. Mein Setup ist

Gegenstand-> Waffe -> (spezifische Waffe hier).

Alle Klassen erben die vorherige.

Ich kann die Werte der Elemente wie Holy_Sword und Stick nicht drucken. Ich kann sie drucken, wenn ich sie nicht als Klassen erstelle und einfach eine Variable verwende, um die Waffeninstanz zu erstellen. Aufgrund dessen, was ich später machen möchte, möchte ich wirklich, dass sie Klassen sind.

Der Fehler Ich erhalte ist:

ungebundene Methode str() muss mit Holy_Sword Instanz aufgerufen werden als erstes Argument (nichts stattdessen bekam)

Mein Code ist:

class Item(object): 
    def __init__(self, name, value, description): 
     self.name = name 
     self.value = value 
     self.description = description 
    def item_description(self): 
     return "Your %s is worth %d gold and is a %s" % (self.name, self.value, self.description) 

class Weapon(Item): 
    def __init__(self,name, value,description, attack): 
     self.attack = attack 
     super(Weapon, self).__init__(name, value, description) 
    def __str__(self): 
     return "Your %s is worth %d gold and has an Attack Damage of %d, it is %s" % (self.name, self.value, self.attack, self.description) 

class Stick(Weapon): 
    def __init__(self, name, value, description, attack): 
     super(Stick, self).__init__(name = "Stick", value= 1, description = "A stick...there may be potential here....or not.", attack = 1) 

class Holy_Sword(Weapon): 
    def __init__(self, name, value, description, attack): 
     super(Holy_Sword, self).__init__(name = "The Holy Sword of Antioch", value= 20, description = "A Sword whose potential far outweighs it's lack of stylishness ", attack = 20) 

class Sword(Weapon): 
    def __init__(self, name, value, description, attack): 
     super(Sword, self).__init__(name = "Sword", value= 3, description = "A Wooden Sword.", attack = 5) 


print Holy_Sword.__str__() 

Antwort

1

Sie müssen zuerst die Klasse instanziieren:

my_sword = Holy_sword(...) 
print my_sword.__str__() 
1

Beachten Sie, dass in dem Code, den Sie hier haben, Holy_Sword bezieht sich auf eine Klasse. Es ist nicht selbst eine Instanz von Item.

Holy_Sword.__str__ ist eine Instanzmethode. Es kann nicht von alleine aufgerufen werden, als würdest du es hier versuchen; Es muss über eine Instanz der Holy_Sword Klasse aufgerufen werden.

(Beachten Sie, dass es in der Regel besser ist, nicht __str__ direkt aufzurufen. Diese Methode sollte in der Regel nur durch die str() Funktion, zB str(Holy_Sword) genannt werden.)

Was können Sie tun, ist eine Instanz von Holy_Sword erstellen und die Zeichenfolge drucken Wert, dass:

sword = Holy_Sword() 
print str(sword) 

jedoch, können Sie stattdessen betrachten Holy_Sword eine Instanz von Weapon mit bestimmten Attributen sein zu machen, anstatt eine Unterklasse zu sein. Wenn der einzige Weg, sich von anderen Waffen zu unterscheiden, in seinen Attributen liegt, braucht es keine separate Klasse zu sein.