Mi interessa sapere se c'è un modo per analizzare infallibilmente un'istanza Python per vedere il suo __dict__
nonostante tutti gli ostacoli che il programmatore potrebbe aver gettato nel modo, perché questo mi aiuterebbe a risolvere problemi come loop di riferimento involontari e risorse penzolanti come open File.È possibile ispezionare obj .__ dict__ se la classe ha una variabile __dict__?
Un esempio più semplice è: come posso vedere i tasti di una sottoclasse dict
se il programmatore ha nascosto keys()
dietro una classe a sé stante? Il modo per aggirare questo è quello di chiamare manualmente il metodo dict
keys()
invece di lasciare eredità chiamare la versione della sottoclasse del metodo:
# 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']
Ora la mia domanda reale è, come posso vedere la __dict__
di un'istanza, non importa quale il programmatore potrebbe averlo fatto per nasconderlo da me? Se si imposta una variabile __dict__
classe allora sembra ombra l'attuale __dict__
di tutti gli oggetti ereditati da quella classe:
# 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'}
Questo valore false per __dict__
non lo fa, come si può vedere, interferire con l'impostazione attributo reale e ottenere , ma fuorvia dir()
nascondendo a
e b
e visualizza fake
come variabile di istanza dell'oggetto.
Ancora una volta, il mio obiettivo è scrivere uno strumento che mi aiuti a introspezionare le istanze di classe per vedere "cosa sta realmente accadendo" quando mi chiedo perché un insieme di istanze di classe richieda così tanta memoria o tenga aperti così tanti file - e anche se la situazione di cui sopra è estremamente artificiosa, trovare un modo per aggirarlo permetterebbe allo strumento di funzionare sempre, invece di dire "funziona alla grande, a meno che la classe che stai guardando non abbia ... [descrizione della situazione eccezionale sopra."
avevo pensato che sarei in grado di afferrare infallibilmente la __dict__
con qualcosa di simile:
dict_descr = object.__dict__['__dict__']
print dict_descr(ddh, DunderDictHider)
Ma si scopre che object
non ha un descrittore __dict__
. Invece, la funzione C subtype_dict()
sembra essere collegata separatamente a ciascuna sottoclasse di object
creata dal programmatore; non esiste un modo centrale per nominare o recuperare il descrittore in modo che possa essere applicato manualmente agli oggetti la cui classe lo ombreggia.
Qualche idea, qualcuno? :)
Grazie per avermi aiutato a pensare ulteriormente! Quindi questa è una via d'uscita se, nella gerarchia ereditaria 'object' →' A' → 'B', l'oggetto' B' è quello che ombreggia le sue istanze ''__dict__' attributi. Ma ho ragione che la tua idea non * aiuta * se si tratta della classe 'A' che sta definendo un attributo di classe' __dict__' fuorviante? –