2010-07-26 80 views
0

這個問題是這樣的:我有一個類的實例,我想知道這是什麼列表的一部分,即:查找什麼列表類的一個實例是,在Python

class test_class() : 
    def test() : 
     print 'I am a member of list', parent_list 

foo = [test_class(), 52, 63] 
bar = ['spam', 'eggs'] 
foo[0].test() 

我會喜歡打印出我是名單foo的成員。任何給定的test_class()實例都可以屬於任意數量的列表。

+0

你的問題不太清楚。你想測試課程是否在某個列表中? – tjvr 2010-07-26 09:16:28

+0

您是否在尋找綁定到實例所包含的任何/所有列表的名稱? – 2010-07-26 09:17:31

回答

1

首先,我不知道這可能是用例吧,因爲理想而把對象列表,你可以通過字典跟蹤他們,甚至如果你有所有列表的列表你可以檢查它們中的對象,所以更好的設計不需要這樣的搜索。

所以,讓我們假設爲樂趣,我們想知道其中列出了一個對象。我們可以利用該gc知道的所有對象,誰指的是它,所以這裏是一個which_list功能,告訴它列出引用它的事實(這一定並不意味着它包含它)

import gc 

class A(object): pass 
class B(A): pass 

def which_list(self): 
    lists_referring_to_me = [] 
    for obj in gc.get_referrers(self): 
     if isinstance(obj, list): 
      lists_referring_to_me.append(obj) 

    return lists_referring_to_me 


a = A() 
b = B() 
foo = [a, 52, b] 
bar = ['spam', b] 

print which_list(a) 
print which_list(b) 

輸出:

[[<__main__.A object at 0x00B7FAD0>, 52, <__main__.B object at 0x00B7FAF0>]] 
[[<__main__.A object at 0x00B7FAD0>, 52, <__main__.B object at 0x00B7FAF0>], ['spam', <__main__.B object at 0x00B7FAF0>]] 
0

由於列表中沒有名稱,因此這是不可能的。你必須把列表中的一些容器,能記住的名字,例如一類:

class container(object): 
    def locate(self, thing): 
     for name, member in self.__dict__: 
      if type(member) == type([]) and thing in member: 
       print 'Found it in',name 
       return 
     print 'Sorry, nothing found' 

c = container() 
c.foo = [test_class(), 52, 63] 
c.bar = ['spam', 'eggs'] 
0

你可以使用the globals() function找到所有當前定義的全局符號,過濾此找到所有列表,然後檢查如果該物品在他們身上。

>>> class test_class(): 
...  def test(self): 
...   print "I am a member of the following lists", \ 
...    [name for (name,value) in globals().items() if isinstance(value,list) and self in value] 
... 
>>> foo = [test_class(), 52, 63] 
>>> bar = ['spam', 'eggs'] 
>>> foo[0].test() 
I am a member of the following lists ['foo'] 
0

你可以找到所有包含該對象很容易地名單,但它聽起來像是你接近這個問題耳鼻喉科irely錯誤的方式。在實例中將參考記錄回包含這些對象的列表會更好。

但是,既然你問了,這裏的文字回答你的問題:

>>> import gc 
>>> class test_class(): 
    def test(self): 
     lists = [l for l in gc.get_referrers(self) if isinstance(l, list)] 
     print('I am in lists at ' + ','.join(str(id(l)) for l in lists)) 


>>> foo = [test_class(), 52, 63] 
>>> bar = ['spam', 'eggs'] 
>>> foo[0].test() 
I am in lists at 18704624 

注意,當然,你可以找到的名單,但不會告訴你任何可能存在的名字用於引用這些列表。如果您需要名稱,則將這些列表包裝在具有名稱的類中,並從每個test_class實例中添加對包含類的引用。

相關問題