¿Hay algún método que pueda anular que me permita usar declaraciones de impresión/pdb/etc. para realizar un seguimiento de cada vez que se asigna una instancia de mi clase? Mientras deshace algunos objetos, parece que obtengo algunos que nunca han llamado a __setstate__
o __init__
. Intenté sobreescribir __new__
e imprimir la identificación de cada objeto que hago en __new__
, pero todavía encuentro objetos con identificadores que nunca se imprimieron.Asignación de objetos de seguimiento en python
Editar: aquí está mi código que utilizo para alterar (instrumentación) __new__
de mi clase y todas sus superclases excepción de object
sí:
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__)
llamo replace_allocator en la clase padre mis clases como pronto como se importa en el script principal. Para empezar, mi clase tiene un __new__
personalizado, que también imprime la identificación.
¿Está absolutamente seguro de que son instancias diferentes? ¿Ha comprobado si 'id (instancia)' coincide? –
¿Está tratando de usar 'Allocator (cls)' como tipo de conversión? Si es así, es incorrecto, porque en Python es una llamada de constructor para un objeto 'Allocator', y la parte' .new' obtendrá una nueva instancia de método de límite. – Apalala
Rosh: Sí. Mi función asignador muestra la forma en que imprimo mi id (instancia). Más tarde, cuando encuentro un objeto al que le faltan algunos campos que debería haber sido agregado por setstate o init, también imprimo su id. Si grep para esa identificación en las impresiones anteriores no hay hits. –