Interesuje mnie, czy istnieje sposób introspekcji instancji Pythona nieomylnie, aby zobaczyć jej __dict__
pomimo przeszkód, które programista mógł rzucić na drodze, ponieważ to pomogłoby mi w debugowaniu problemów, takich jak niezamierzone pętle referencyjne i zwisające zasoby, takie jak otwarte akta.Czy można obj____ sprawdzić, czy klasa ma zmienną __dict__?
Prostszym przykładem jest: jak mogę zobaczyć klucze podklasy dict
, jeśli programista ukrył keys()
za własną klasą? Dookoła to ręcznie wywołać metodę dict
keys()
zamiast pozwolić dziedziczenie nazywamy wersję podklasy za metody:
# Simple example of getting to the real info
# about an instance
class KeyHidingDict(dict):
def keys(self):
return [] # there are no keys here!
khd = KeyHidingDict(a=1, b=2, c=3)
khd.keys() # drat, returns []
dict.keys(khd) # aha! returns ['a', 'b', 'c']
Teraz moje rzeczywiste pytanie jest, jak widzę __dict__
od instancji, bez względu na to, co programista mógł zrobić, aby ukryć to ode mnie? Gdyby ustawić zmienną __dict__
klasy następnie wydaje cień rzeczywistej __dict__
jakichkolwiek przedmiotów odziedziczonych z tej klasy:
# My actual question
class DunderDictHider(object):
__dict__ = {'fake': 'dict'}
ddh = DunderDictHider()
ddh.a = 1
ddh.b = 2
print ddh.a # prints out 1
print ddh.__dict__ # drat, prints {'fake': 'dict'}
Ta fałszywa wartość dla __dict__
nie jest, jak widać, kolidować z ustawieniem rzeczywiste atrybut i coraz , ale wprowadza w błąd dir()
, ukrywając a
i b
i wyświetlając fake
jako zmienną instancji obiektu.
Jeszcze raz, moim celem jest napisanie narzędzia, które pomaga mi w introspekcji instancji klasy, aby zobaczyć, "co tak naprawdę się dzieje", gdy zastanawiam się, dlaczego zestaw wystąpień klasy zabiera tak dużo pamięci lub trzyma tak wiele plików otwartych - i mimo że powyższa sytuacja jest wyjątkowo wymyślna, znalezienie sposobu na to pozwoliło by narzędzie działało przez cały czas, zamiast mówić "działa świetnie, chyba że klasa którą oglądasz ma ... [opis wyjątkowej sytuacji powyżej]."
myślałem, że będę w stanie niezawodnie chwycić __dict__
z czymś takim:
dict_descr = object.__dict__['__dict__']
print dict_descr(ddh, DunderDictHider)
Ale okazuje się, że object
nie ma deskryptora __dict__
. Zamiast tego wydaje się, że funkcja C jest oddzielnie dołączana do każdej podklasy object
, którą programista tworzy; nie ma centralnego sposobu nazywania ani pobierania deskryptora, aby można go było ręcznie zastosować do obiektów, których klasa go cienia.
Jakieś pomysły, ktoś? :)
Dziękuję za pomoc w dalszym myśleniu! A więc jest to wyjście, jeśli w hierarchii dziedziczenia 'obiekt' →' A' → 'B', obiekt' B' jest tym, który śledzi jego atrybuty "__dict__". Ale czy mam rację, że twój pomysł nie pomaga, jeśli klasa "A" definiuje mylący atrybut klasy "__dict__"? –