Klassenattribute, die nicht an Objekte übergeben werden

Ich versuche, ein sehr einfaches RPG-ähnliches Spiel zu erstellen, in dem du einen Charakter auswählst, dem Charakter eine Waffe gibst und dann sagst, dass er einen anderen Charakter mit Schäden angreift, der auf den Stats des Charakters und der Waffe basiert. Die weapon gehört zu einer Top-Level-Klasse namens Equip . Wenn ich versuche, eine Angriffsschadensvariable zu setzen, die die Waffenstatistiken enthält, bekomme ich aber:

 'Char' object has no attribute 'weapon.' 

Ich habe den Char Class- weapon auf None als Standard gesetzt. Aber unten habe ich den Charakter ( dean ) eine Waffe gegeben, indem dean.weapon = sword (das ist eine weapon ) benutzt. Ich habe versucht, weapon.wgt zu self.weapon.wgt aber das scheint nicht zu helfen.

Sehen Sie sich die entsprechenden Teile des Codes an und lassen Sie den attack , denn ich glaube nicht, dass es für die Frage relevant ist und die Dinge verstopfen wird, aber ich werde es tun, wenn es notwendig ist.

Ich glaube, der Code ist ein Chaos, so konstruktive Kritik wird geschätzt werden.

Code:

 class Char(object): def __init__(self, name): name = name hp = 300 mp = 10 strn = 1 dmg = 1 dex = 1 armor = 0 weapon = None attack_speed = dex intact_bones = ["right arm", "left arm", "right leg", "leg leg", "skull", "sternum", "nose"] # JUST ASSUME RIGHT SIDE IS PRIMARY SIDE FOR NOW broken_bones = [] ### define what to do per bone if bone is in this list dmg = strn * self.weapon.wgt class Equip(object): wgt = 1 desc = "" def __init__(self, name): self.name = name class weapon(Equip): impact = 1 sharp = 1 def __init__(self, name): self.name = name sword = weapon("Sword") sword.wgt = 10 sword.impact = 6 sword.sharp = 7 dean.weapon = sword dean.attack(hamilton) 

2 Solutions collect form web for “Klassenattribute, die nicht an Objekte übergeben werden”

Denken Sie daran, self zu verwenden, wie in Ihren anderen __init__ Methoden, um Attribute der Instanz zu machen.

 def __init__(self, name): self.name = name self.hp = 300 ... self.weapon = None 

Auch denke ich, dass die anderen Attribute auch __init__ sollten, dh sie in die __init__ Methoden setzen und self , zB self.wgt , self.impact , self.broken_bones etc.

Ändern Sie den Körper des Konstruktors, denn jetzt weisen Sie den lokalen Variablen und nicht den Objektvariablen Werte zu:

 def __init__(self, name): self.name = name self.hp = 300 self.mp = 10 self.strn = 1 self.dmg = 1 self.dex = 1 self.armor = 0 self.weapon = None 
Python ist die beste Programmiersprache der Welt.