可以「註冊」你與你的類的實例,在類屬性:
class foo:
_instances = []
def __init__(self, value):
self.value = value
foo._instances.append(self)
def getvalues(self):
return sum(instance.value for instance in foo._instances)
注意,這會保留情況下撒手人寰!你不得不使用weak references避免:
from weakref import WeakSet
class foo:
_instances = WeakSet()
def __init__(self, value):
self.value = value
foo._instances.add(self)
def getvalues(self):
return sum(instance.value for instance in foo._instances)
的WeakSet()
跟蹤的對象,而不讓他們活着;如果對實例的任何其他引用都將降爲0,則該實例將從內存中清除,並且弱集只會停止將其列出。
演示:
>>> from weakref import WeakSet
>>> class foo:
... _instances = WeakSet()
... def __init__(self, value):
... self.value = value
... foo._instances.add(self)
... def getvalues(self):
... return sum(instance.value for instance in foo._instances)
...
>>> Joe = foo(5)
>>> Bob = foo(4)
>>> Jon = foo(3)
>>> Jon.getvalues()
12
>>> del Joe
>>> Jon.getvalues()
7
如果一個實例被垃圾收集,getvalues的值應該減少還是保持sa我?也就是說,getvalues應該是有史以來創建的所有事物(在這種情況下,靜態計數器是合適的)或所有現存事物的值的總和? – 2014-11-08 22:04:30