Je manque évidemment quelque chose de fondamental ici. Espérons que quelqu'un peut me mettre raison! TIA
J'ai une gamme d'objets dont la classe contient des instances d'un autre objet. Mais quand j'ai défini une propriété pour l'une d'entre elles, ils changent tous. P>
class direction(): dest = -1 lock = '' class room(): roomname = '' desc = '' n = direction() s = direction() w = direction() e = direction() item = '' rooms = [] rooms.append( room() ) rooms.append( room() ) rooms.append( room() ) rooms.append( room() ) rooms.append( room() ) rooms[0].roomname = 'outside' rooms[0].desc = '' rooms[0].n.dest = 4 rooms[0].item = '' rooms[1].roomname = 'hall' rooms[1].desc = 'The hallway has doors to the east and south' rooms[1].n.dest = 2 rooms[1].item = ''
3 Réponses :
Vos attributs sont tous déclarés au niveau de la classe, pas de niveau d'instance, ce qui signifie que chaque instance de la classe partagera les mêmes valeurs. Je pense que vous voulez:
Merci, ça marche - mais je ne sais pas pourquoi. Je vais maintenant rechercher la différence entre la classe et le niveau d'instance ...
digitalOcean.com/community/tatudials/ ... Je comprends maintenant. Merci.
Mais ce que je ne comprends pas maintenant, c'est pourquoi mes chambres conservent tous des propriétés de la Nom de la pièce différentes, etc. et ce n'est que la classe imbriquée qui est affectée?
Lorsque vous faites Chambres [1] .roomname = 'Hall Code> Vous créez un nouvel attribut d'instance qui ombreur de la classe Atrribute. Avec
chambres [1] .n.dest = 2 code> Vous définissez une nouvelle valeur pour l'attribut
DEST code>, mais cet attribut appartient à un attribut de niveau de classe existant
n < / code>.
Vous manquez des constructeurs et donc des variables d'instance manquantes p>
Vous définissez des variables de classe, chaque variable est donc la même entre toutes les instances p>
Dans chaque classe, vous avez déclaré un tas d'attributs classe em>. Une mission comme dans votre tentative de " Simplifiez »votre code, vous avez rendu plus compliqué. Définir chambres [0] .roomname = 'extérieur' code> crée un attribut instance em> ombres
room.roomname code>. Cependant, vous ne faites jamais une telle affectation à
Chambres [0] .n code>, donc chaque affectation à quelque chose comme
Chambres [0] .n.Dest code> ajoute un attribut d'instance
DEST code> à la instance em> de
direction code> partagée par chaque instance de
salle code>.
__ init __ code> pour définir vos attributs em> instance em>; Les attributs de classe ne sont pas utilisés aussi souvent. P>
class Direction:
def __init__(self, dest, lock=''):
self.dest = dest
self.lock = lock
class Room:
def __init__(self, roomname, desc, item=''):
self.roomname = roomname
self.desc = desc
self.n = direction()
self.s = direction()
self.w = direction()
self.e = direction()
self.item = item
rooms = []
r = Room('outside', '')
r.n.dest = 4
rooms.append(r)
r = Room('hall', 'The hallway has doors to the east and south')
r.n.dest = 2
rooms.append(r)
Merci ça a du sens maintenant. Je viens d'avoir un cours d'accident sur les attributs de classe et d'instance!
BTW s'il vous plaît ignorer le manque de constructeurs - je garde le code simple maintenant et les ajoutera plus tard.
Le manque de constructeurs est i> le problème.