Есть ли какой-нибудь метод, который я могу переопределить, который позволит мне использовать операторы print / pdb / и т.д., чтобы отслеживать каждый раз, когда выделяется экземпляр моего класса? Разбирая некоторые объекты, я, кажется, получаю те, для которых никогда не вызывается __setstate__
или __init__
. Я попытался переопределить __new__
и распечатать идентификатор каждого объекта, который я сделал в __new__
, но я все еще сталкиваюсь с объектами с идентификаторами, которые никогда не были напечатаны.
Редактировать: вот мой код, который я использую для изменения (инструментирования) __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__
для начала, который также печатает идентификатор.