Python 反射

5 投票
4 回答
5981 浏览
提问于 2025-04-16 15:52

假设我们在内存中有很多对象,每个对象都有一个独特的ID。我们该如何遍历这些对象,以找到一个特定的对象,并与某个ID进行比较呢?这样我们就可以通过getattr来获取并使用它。

4 个回答

0

你可以创建一个叫做“注册表”的字典,所有新创建的实例都会在这里注册,并且这个字典会把ID和对象对应起来:

registry = {}

class MyClass(object):
    def __init__(self, ...):
        id = ...
        registry[id] = self

MyClass.__all__ = registry

这个方法和其他被接受的解决方案是一样的(不过其他那个方法更符合Python的风格)。我之前对这个方法做过两种改进:1)你可以创建一个自定义的容器类来作为注册表,这样你就可以通过不止ID的方式来查找;2)你还可以创建一个元类,自动添加这些代码,但如果你还需要元类来做其他事情,这样可能会变得复杂。

补充:因为其他答案已经可以接受,所以我增加了一些方法来提炼设计模式。

2

你可以请求垃圾回收器列出所有现存的对象,然后逐个查看这些对象,看看你想要的是什么,但这样做可能不是个好主意,除非你有特别的理由去这么做。

10

你应该在类的属性中保存这些对象的集合,也就是说,当这些对象被创建时,就把它们放到一个地方,然后提供一个类的方法来获取这些对象。

大概可以这样做:

class Thing(object):
    all = {}

    def __init__(self, id, also, etc):
        self.id = id
        self.all[id] = self

    @classmethod
    def by_id(cls, id):
        return cls.all[id]

撰写回答