2012-01-26 3 views
2

Есть ли способ в python \ pydev для просмотра и доступа к экземплярам определенного класса при отладке?
Например, если я определяю SomeClass, и различные модули в одном скрипте интерпретатора python создают экземпляр этого класса, есть ли способ увидеть, сколько таких экземпляров существует в интерпретаторе и получить доступ к их атрибутам в центральном порядке, не прибегая к коду удерживать ссылки на них из одного места (например, модуля, где определен класс)?Доступ ко всем экземплярам класса при отладке

ответ

6

Вы могли бы найти все такие объекты, используя gc.get_objects():

Например, если определить Foo класс в модуле othermod.py:

class Foo(object): 
    pass 

f2 = Foo() 

, то вы можете рассчитывать все экземпляры Foo в сценарии script.py, как это:

import gc 
import othermod 

f = othermod.Foo() 

objs = gc.get_objects() 
# print(len(objs)) 
# 3519 

print(len([obj for obj in objs if isinstance(obj,othermod.Foo)])) 
# 2 

Оговорка: gc.get_objects делает n (например, int или str), но похоже, что это не тот объект, который вы хотите отслеживать.

4

Другой вариант заключается в использовании objgraph модуль:

In [1]: class A(object): pass 

In [2]: class B: pass 

In [3]: test1 = [A() for i in range(3)] 

In [4]: test2 = [A() for i in range(3)] 

In [5]: test3 = [B() for i in range(5)] 

In [6]: import objgraph 

In [7]: objgraph.by_type('A') 
Out[7]: 
[<__main__.A at 0x2ccc130>, 
<__main__.A at 0x2ccc150>, 
<__main__.A at 0x2ccc170>, 
<__main__.A at 0x2cbb790>, 
<__main__.A at 0x2cbb1b0>, 
<__main__.A at 0x2cbb7f0>] 

Но это не будет работать для классов старого стиля:

In [8]: objgraph.by_type('B') 
Out[8]: [] 

objgraph использует информацию от сборщика мусора, как в unutbu ответ.

Смежные вопросы