给定一个保留其对象注册表的类:
class Person(object):
__registry = []
def __init__(self, name):
self.__registry.append(self)
self.name = name
如何使以下代码工作(不使用Person .__注册表):
for personobject in Person:
print personobject
在进行研究时,我发现可以使用__metaclass__
方法获得__getitem__
的提示。有什么想法会是这样吗?
答案 0 :(得分:22)
您可以使用简单的元类使您的类对象可迭代。
class IterRegistry(type):
def __iter__(cls):
return iter(cls._registry)
class Person(object):
__metaclass__ = IterRegistry
_registry = []
def __init__(self, name):
self._registry.append(self)
self.name = name
(我还将__registry
更改为_registry
,以便更轻松地从元类访问)。
然后,
>>> p = Person('John')
>>> p2 = Person('Mary')
>>> for personobject in Person:
... print personobject
...
<person.Person object at 0x70410>
<person.Person object at 0x70250>
答案 1 :(得分:11)
首先,不要使用双__
个名称。它们保留供Python使用。如果您想要“私人”,请使用单_
。
其次,尽可能简化这类事情。不要在复杂的事情上浪费大量的时间和精力。这是一个简单的问题,让代码尽可能简单,以完成工作。
class Person(object):
_registry = []
def __init__(self, name):
self._registry.append(self)
self.name = name
for p in Person._registry:
print p
答案 2 :(得分:2)
你可以用:
for item in Person.__registry:
print(item)