我正在尝试使用类对象的函数来创建新的类对象并遇到问题。这是我到目前为止的代码:
class Room(object):
def __init__(self, name):
self.name = name
self.N = None
self.E = None
self.S = None
self.W = None
'''relevant code'''
def north(self,room):
self.N = Room(room)
self.N.S = self
def south(self,room):
self.S = Room(room)
self.S.N = self
所以我至少想要其中一个打印语句
room1 = Room('room1')
room1.north('room2')
print(room2.S)
print(Room(room2).S)
print(Room('room2').S)
吐出“room1”,但前两个不起作用,因为 room2 作为变量尚未定义,而最后一个不起作用,因为它似乎正在创建一个新对象而不是引用现有的,因此它只打印默认的“无”。
实际上是否存在一种方法来引用未设置变量的现有对象?或者是我做这样的事情的唯一选择?
def north(self,room):
roomDict[room] = Room(room)
self.N = roomDict[room]
self.N.S = self
编辑:我意识到我可能应该调用新 Room 的 South() 函数,而不是直接更改 S 变量,但直观上这似乎会导致循环,所以我还没有触及它。
最佳答案
*根据OP的澄清进行编辑*
如果您想要引用大量对象而不将它们绑定(bind)到变量,则 dict
是最佳选择。
您可以使用@Berci的解决方案。但请注意,使用该解决方案时,如果您已经有一个名为 foo
的房间,则无法通过简单地再次调用 Room('foo')
来覆盖它 - 这样做只会返回原来的 foo
房间。要覆盖现有房间,您必须首先执行 del Room.roomDict['foo']
,然后调用 Room('foo')
。这可能是您想要的,但也可能不是。
下面的实现不那么奇特,不需要 __new__
(事实上,Berci 的解决方案也不需要 __new__
并且可以在 中完成) __init__
):
class Room:
registry = {}
def __init__(self, name):
self.registry[name] = self
# the rest of your __init__ code
如果您希望房间不可覆盖,就像 Berci 的解决方案中那样,只需添加两行:
class Room:
registry = {}
def __init__(self, name):
if name in self.registry:
raise ValueError('room named "{}" already exists'.format(name))
self.registry[name] = self
没有必要将registry
嵌套在Room
中。如果需要,您可以将其设为外部字典。将注册表作为类属性的优点是您的 Room
对象可以将其作为 self.registry
访问,而无需知道其全局名称。 (轻微的)缺点是,每次您都需要输入 Room.registry
或 someroom.registry
而不是仅仅输入 registry
访问它。
关于python - 如何引用没有定义变量的现有类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386926/