0
votes

objet imbriqué dans une classe python

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 = ''


2 commentaires

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 le problème.


3 Réponses :


1
votes

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: xxx


4 commentaires

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 Vous créez un nouvel attribut d'instance qui ombreur de la classe Atrribute. Avec chambres [1] .n.dest = 2 Vous définissez une nouvelle valeur pour l'attribut DEST , mais cet attribut appartient à un attribut de niveau de classe existant n < / code>.



1
votes

Vous manquez des constructeurs et donc des variables d'instance manquantes

Vous définissez des variables de classe, chaque variable est donc la même entre toutes les instances


0 commentaires

0
votes

Dans chaque classe, vous avez déclaré un tas d'attributs classe em>. Une mission comme 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>.

dans votre tentative de " Simplifiez »votre code, vous avez rendu plus compliqué. Définir __ 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)


1 commentaires

Merci ça a du sens maintenant. Je viens d'avoir un cours d'accident sur les attributs de classe et d'instance!