2014-11-08 79 views
0

想法是該類包含多個實例,並且當某個實例被某個方法調用時,它會檢查同一類的所有其他現有實例以獲取某個值。或者,可能會更容易在代碼中制定: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__中給出額外的名稱屬性,它與Joe = foo("Joe", 5)中的實例名稱相對應,並累積在某種外部列表中。但這似乎不是一個很好的解決方案。什麼是這樣做的方式?

+0

如果一個實例被垃圾收集,getvalues的值應該減少還是保持sa我?也就是說,getvalues應該是有史以來創建的所有事物(在這種情況下,靜態計數器是合適的)或所有現存事物的值的總和? – 2014-11-08 22:04:30

回答

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,則該實例將從內存中清除,並且弱集只會停止將其列出。

演示:

>>> 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 
+0

經過對不同應用程序的一些基本測試後,這似乎每次都在發揮作用。現在我開始在我的項目中實現這一點。謝謝。 – 2014-11-08 22:30:55

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 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 
+0

問題不在於將數字加在一起。我不認爲這會在迭代函數中起作用,例如,實例有一些座標,並且在每次迭代採取一些操作之前檢查其他實例的座標。 – 2014-11-08 22:07:19

+0

@ A.Val。它只是一個簡單的類屬性示例,它在實例之間共享,我提供的鏈接有詳細的解釋和用例,您如何操作它完全取決於您想要實現的目標 – 2014-11-08 22:09:05

+0

你也沒有在這裏處理*實例刪除*。 – 2014-11-08 22:10:15

相關問題