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

2024-04-26 10:46:30 发布

您现在位置:Python中文网/ 问答频道 /正文

其思想是,类包含多个实例,当为某个方法调用其中一个实例时,它会检查同一类的所有其他现有实例中的某个值。或者,也许用代码来表述会更容易:

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__中提供额外的name属性,该属性对应于Joe = foo("Joe", 5)中的实例名,并在某种外部列表中累积。但这似乎不是一个很好的解决办法。怎么做呢?你知道吗


Tags: 实例方法代码self属性fooinitvalue
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

使用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

相关问题 更多 >