Python 反射
假设我们在内存中有很多对象,每个对象都有一个独特的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]