Python中对象初始化时引用未初始化对象的优化方案问询
实现Python对象互相引用的简洁方案
针对你遇到的对象互相引用初始化顺序问题,这里有几种更简洁的实现方式:
1. 给Room类添加邻接房间的方法
给Room类加一个add_adj方法,创建完房间后直接调用方法关联,代码更连贯,还能避开可变默认参数的陷阱:
class Room(object): def __init__(self, name="The Room"): self.name = name self.adj = {} # 内部初始化空字典,避免所有实例共享同一字典的问题 def add_adj(self, direction, room): self.adj[direction] = room # 创建房间实例 room1 = Room("Room 1") room2 = Room("Room 2") room3 = Room("Room 3") # 直接调用方法关联邻接关系 room1.add_adj('n', room2) room1.add_adj('s', room3) room2.add_adj('s', room1) room3.add_adj('n', room1)
2. 使用字符串名称延迟绑定
如果需要定义大量房间,可先用字符串指代邻接房间,最后统一解析绑定,不用纠结创建顺序:
class Room(object): def __init__(self, name="The Room", adj=None): self.name = name self.adj = adj or {} self._unresolved = adj or {} # 暂存未解析的字符串名称 def resolve_adj(self, room_map): # 把字符串名称替换为实际房间对象 for dir, name in self._unresolved.items(): self.adj[dir] = room_map[name] self._unresolved = {} # 创建时用字符串指代邻接房间 room1 = Room("Room 1", {'n': 'Room 2', 's': 'Room 3'}) room2 = Room("Room 2", {'s': 'Room 1'}) room3 = Room("Room 3", {'n': 'Room 1'}) # 构建房间名称到实例的映射 room_map = {r.name: r for r in [room1, room2, room3]} # 统一解析所有邻接关系 for room in room_map.values(): room.resolve_adj(room_map)
3. 用工厂函数封装创建逻辑
把房间创建和关联的逻辑封装到一个函数里,外部调用一步到位:
class Room(object): def __init__(self, name="The Room"): self.name = name self.adj = {} def create_linked_rooms(): # 在函数内部完成创建和关联 room1 = Room("Room 1") room2 = Room("Room 2") room3 = Room("Room 3") room1.adj = {'n': room2, 's': room3} room2.adj = {'s': room1} room3.adj = {'n': room1} return room1, room2, room3 # 直接获取所有关联好的房间 room1, room2, room3 = create_linked_rooms()
内容的提问来源于stack exchange,提问作者Natty
相关产品推荐
相关产品推荐

