python - 如何引用没有定义变量的现有类对象?

标签 python class python-3.x object

我正在尝试使用类对象的函数来创建新的类对象并遇到问题。这是我到目前为止的代码:

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.registrysomeroom.registry 而不是仅仅输入 registry访问它。

关于python - 如何引用没有定义变量的现有类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386926/

相关文章:

python - 在嵌套列表中拆分字符串

python - 查找二维数组中未满 NaN 的第一行的行索引

java - 我输入的分数总是返回 0?

python - Cron 失败并显示消息 Superset : command not found

python - 如果密码正确,如何发现 'Access granted' 被打印了 3 次?

python - Django 中将foreignkey 放在哪里?

python - 计算张量后,如何将其显示为图像?

c++ - 'new' 关键字和类存储

c++ - 专门的 shared_ptr 转换 C++0x

python - nonlocals() 在哪里?