Доступ ко всем экземплярам класса во время отладки - PullRequest
2 голосов
/ 26 января 2012

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

Ответы [ 2 ]

6 голосов
/ 26 января 2012

Вы можете найти все такие объекты, используя 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 не отслеживает экземпляры атомарных типов (например, int или str), но, похоже, это не тот тип объекта, который вы хотите отслеживать.

4 голосов
/ 26 января 2012

Другой вариант - использовать 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 answer.

...