вложенный объект в классе Python - PullRequest
0 голосов
/ 30 апреля 2019

Я явно упускаю что-то фундаментальное. Надеюсь, кто-то может исправить меня! ТИА

У меня есть массив объектов, класс которых содержит экземпляры другого объекта. Но когда я устанавливаю свойство для одного из них, все они меняются.

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

если я перебираю свойства n.dest в списке комнат, то все возвращаются как 2

Как будто все объекты направления в каждом объекте в списке комнат являются единым экземпляром, и установка одного значения в одном из них устанавливает его для всех из них.

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Вам не хватает конструкторов, и, следовательно, отсутствуют переменные экземпляра

Вы определяете переменные класса, поэтому каждая переменная одинакова для всех экземпляров

1 голос
/ 30 апреля 2019

Все ваши атрибуты объявлены на уровне класса, а не на уровне экземпляра, а это означает, что каждый экземпляр класса будет иметь одинаковые значения. Я думаю, что вы хотите:

class Room():
    def __init__(self):
        self.roomname = ''
        self.desc = ''
        self.n = direction()
        self.s = direction()
        self.w = direction()
        self.e = direction()
        self.item = ''
0 голосов
/ 30 апреля 2019

В каждом классе вы объявили набор атрибутов class . Присвоение типа rooms[0].roomname = 'outside' создает атрибут instance , который затеняет room.roomname. Однако на самом деле вы никогда не делаете такого назначения для rooms[0].n, поэтому каждое назначение для чего-то вроде rooms[0].n.dest добавляет атрибут экземпляра dest к тому же экземпляру direction, который используется каждым экземпляром room.

Пытаясь «упростить» свой код, вы сделали его более сложным. Определите __init__ для установки атрибутов instance ; Атрибуты класса используются не так часто.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...