嵌套类python

2024-04-16 17:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

很明显我遗漏了一些基本的东西。希望有人能纠正我!短暂性脑缺血发作

我有一个对象数组,其类包含另一个对象的实例。但当我为其中一个设置属性时,它们都会改变。你知道吗

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

如果我遍历rooms列表中的n.dest属性,那么所有属性都返回为2

就好像“房间”列表中每个对象中的方向对象都是一个实例,在其中一个实例中设置一个值将为所有实例设置方向。你知道吗


Tags: 对象实例列表属性方向itemdescclass
3条回答

您的属性都是在类级别声明的,而不是在实例级别声明的,这意味着类的每个实例都将共享相同的值。我想你想要:

class Room():
    def __init__(self):
        self.roomname = ''
        self.desc = ''
        self.n = direction()
        self.s = direction()
        self.w = direction()
        self.e = direction()
        self.item = ''

缺少构造函数,因此缺少实例变量

您正在定义类变量,因此所有实例之间的每个变量都是相同的

在每个类中,您都声明了一组属性。像rooms[0].roomname = 'outside'这样的赋值创建了一个实例属性,该属性对room.roomname进行阴影处理。但是,您实际上从未对rooms[0].n进行任何此类赋值,因此对rooms[0].n.dest之类的对象的每个赋值都是将实例属性dest添加到room的每个实例共享的direction相同的实例中。你知道吗

在你试图“简化”你的代码时,你已经使它变得更复杂了。定义__init__来设置实例属性;类属性不经常使用。你知道吗

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)

相关问题 更多 >