想法是该类包含多个实例,并且当为某个方法调用其中一个实例时,它会针对某个值检查同一类的所有其他现有实例。或者,也许,在代码中制定更容易:
class foo:
def __init__(self, value):
self.value = value
def getvalues(self):
self.magichappenshere = '?'
Joe = foo(5)
Bob = foo(4)
Jon = foo(3)
Jon.getvalues()
#expected output:
#12
如何在没有明确调用它们的情况下引用其他实例?我想在__init__
中提供额外的名称属性,该属性对应于Joe = foo("Joe", 5)
中的实例名称,并累积在某种外部列表中。但这似乎不是一个很好的解决方案。怎么办?
答案 0 :(得分:2)
您可以注册'您的类的实例,在类属性中:
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,则实例将从内存中清除,foo._instances
弱集将仅停止列出它。
演示:
>>> 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
答案 1 :(得分:1)
使用class attribute跟踪值的总和
class foo:
value_sum = 0
def __init__(self, value):
self.value = value
foo.value_sum += value
def getvalues(self):
return foo.value_sum
在python中你不需要getter所以我只是直接访问class属性:
class foo:
value_sum = 0
def __init__(self, value):
self.value = value
foo.value_sum += value
Joe = foo(5)
Bob = foo(4)
Jon = foo(3)
print foo.value_sum