Python:引用类对象的其他实例

时间:2014-11-08 21:59:20

标签: python class

想法是该类包含多个实例,并且当为某个方法调用其中一个实例时,它会针对某个值检查同一类的所有其他现有实例。或者,也许,在代码中制定更容易:

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)中的实例名称,并累积在某种外部列表中。但这似乎不是一个很好的解决方案。怎么办?

2 个答案:

答案 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