我有任務創建一個可迭代的類上ITER返回已經從這個類創建的實例列表上的迭代器,例如:如何爲我的任務創建適當的元類?
x = SomeClass()
y = SomeClass()
for obj in SomeClass:
print obj
>><__main__.SomeClass object at .......> and etc
我做它通過元類和全局()。它看起來很糟糕,但它起作用。我想找到一種更優雅和pythonic的方式;起初我想通過weakref做到這一點,但我不明白我如何從我的元類獲得工作類的一些變量,並且當我嘗試在我的元類中存儲對象的ref時,它正在創建一個ref給我類,所以這是我的實現:
class ObjectsInMemory(object):
class __metaclass__(type):
def __init__(self, *args, **kwargs):
self.name = args[0]
def __iter__(self):
glob = globals().copy()
cls_inst = []
for _, v in glob.iteritems():
try:
if self.name in v.__repr__():
cls_inst.append(v)
except TypeError:
pass
yield cls_inst
+1爲InstanceTracker對象的想法 - 即使需要更多的管理來保持它,它比元類或全局變量更清潔。 – Pyrce 2012-08-09 17:20:43
它只需要額外增加兩行來編寫元類,而且一旦理解了元類的工作原理,它就很簡單。 – 2012-08-10 13:46:36
@NoctisSkytower:我知道如何用元類來做到這一點。無論如何,由於其隱藏的全局狀態和反直覺的類迭代行爲,我不喜歡該解決方案。這可能是一個有趣的練習,但在實踐中,我更喜歡更簡單和更明確的解決方案。 – 2012-08-10 14:24:19