我不知道它的官方术语,所以我就叫它"双重观察";。假设我有一个类(过于简化(:
class Room:
def __init__(self, west, east, north, south):
self.west = west
self.east = east
self.north = north
self.south = south
在我的代码中,我会这样定义一些房间:
room2 = Room(east = room1)
room1 = Room(west = room2)
这引发了一个错误,因为在定义房间2时尚未定义room1
。我通过事先将room1设置为None来解决这个问题,但我意识到,当我想做类似player.location
的事情时,如果玩家在room2(会返回room2(,我告诉玩家往东走,他们就会选择None。
我需要做什么来确保房间彼此同步,因此我称之为双重观察。我不想自动做到这一点,所以每个房间的西面都是那个房间的东面,因为我不想把自己局限于此,所以我想知道实现这一点的最佳方法是什么。
提前感谢!
与其将链接作为房间初始化的一部分,不如将其委托给一个单独的函数,该函数将未初始化的房间作为参数。
例如,
def add_passage(r1, dir1, rm, dir2):
setattr(r1, dir1, r2)
setattr(r2, dir2, r1)
room1 = Room()
room2 = Room()
add_passage(room1, 'east', room2, 'west')
add_passage
提供的接口可以改进,但基本思想是将创建房间的想法与将其连接到另一个房间的想法分开。
请注意,这并不限制您";直的";段落;您可以通过东门离开room1
到达room2
,但从room2
乘坐南门返回room1
:
add_passage(room1, 'east', room2, 'south')
您可以先将其定义为None
,然后再进行更改。看看我的例子:
class Room:
def __init__(self, west=None, east=None, north=None, south=None):
self.west = west
self.east = east
self.north = north
self.south = south
类将自动将方向设置为None
,除非您给它一个值。然后我创建房间,首先是room2
,然后是room1
,然后我将room1
添加到room2.east
:
room2 = Room()
room1 = Room(west = room2)
room2.east = room1
然后我测试了:
print(room2 is room1.west)
print(room1 is room2.west)
print(room1 is room2.east)
正如预期的那样,输出是:
True
False
True