Czy istnieje metoda, którą można przesłonić, która pozwoli mi używać instrukcji print/pdb/etc. do śledzenia każdego wystąpienia instancji mojej klasy? Podczas rozpakowywania niektórych obiektów, wydaje mi się, że dostałem niektóre, które nigdy nie wywoływały ani jednego, ani drugiego. Próbowałem przesłonić __new__
i wydrukować identyfikator każdego obiektu, który wykonuję w __new__
, ale wciąż napotykam obiekty z identyfikatorami, które nigdy nie zostały wydrukowane.Przyporządkowanie obiektów śledzących w pythonie
Edycja: tutaj jest mój kod używam na zmianę (instrumentacji) __new__
z mojej klasy i wszystkie jego super-klas z wyjątkiem samego 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__)
Wzywam replace_allocator na klasy nadrzędnej moich klas jako wkrótce po zaimportowaniu do głównego skryptu. Moja klasa ma niestandardowy __new__
na początek, który również wypisuje identyfikator.
Czy jesteś całkowicie pewien, że są to różne instancje? Czy sprawdziłeś, czy 'id (instancja)' pasuje? –
Czy próbujesz użyć 'Alokatora (cls)' jako rzutowania typu? Jeśli tak, to jest błędne, ponieważ w Pythonie jest to wywołanie konstruktora dla obiektu 'Allocator', a część' .new' otrzyma nową instancję klasy wiążącej. – Apalala
Rosh: Tak. Moja funkcja alokatora pokazuje sposób, w jaki wypiszę id (wystąpienie). Później, gdy znajdę obiekt, w którym brakuje niektórych pól, które powinny zostać dodane przez setstate lub init, wydrukuję również jego identyfikator. Jeśli szukam tego identyfikatora we wcześniejszych wydrukach, nie ma trafień. –