Есть ли какой-либо метод, который я могу переопределить, что позволит мне использовать операторы печати/pdb/и т. Д., Чтобы отслеживать каждый раз, когда выделен экземпляр моего класса? В то время как при разрыве некоторых объектов я, похоже, получаю некоторые, у которых никогда не было ни __setstate__
, ни __init__
. Я попытался переопределить __new__
и распечатать идентификатор каждого объекта, который я делаю в __new__
, но я все еще сталкиваюсь с объектами с идентификаторами, которые никогда не были напечатаны.Отслеживание размещения объекта в python
Edit: Вот мой код я использую для изменения (инструментирование) __new__
моего класса и все его супер-классов для самого object
, за исключением:
class Allocator:
def __init__(self, my_class):
self.my_class = my_class
self.old_new = my_class.__new__
def new(self, * args, ** kargs):
rval = self.old_new(*args, ** kargs)
#rval = super(self.my_class,cls).__new__(cls)
print 'Made '+str(self.my_class)+' with id '+str(id(rval))
return rval
def replace_allocator(cls):
if cls == object:
return
setattr(cls,'__new__',Allocator(cls).new)
print cls.__base__
try:
for parent in cls.__base__:
replace_allocator(parent)
except:
replace_allocator(cls.__base__)
Я называю replace_allocator на родительский класс моих классов, как вскоре, поскольку он импортируется в основной скрипт. У моего класса есть обычай __new__
, который также выводит идентификатор.
Вы абсолютно точно знаете, что это разные случаи? Вы проверили, соответствует ли 'id (instance)'? –
Вы пытаетесь использовать 'Allocator (cls)' как тип cast? Если это так, это неправильно, потому что в Python это вызов конструктора для объекта «Allocator», а часть '.new' получит новый экземпляр связанного метода. – Apalala
Рош: Да. Моя функция распределения указывает, как я распечатываю идентификатор (экземпляр). Позже, когда я нахожу объект, который пропускает некоторые поля, которые должны были быть добавлены setstate или init, я распечатываю его идентификатор. Если я grep для этого идентификатора в более ранних распечатках, нет хитов. –