Меня интересует, существует ли способ безошибочно проанализировать экземпляр Python, чтобы увидеть его __dict__
, несмотря на любые препятствия, которые мог бы создать программист, поскольку это помогло бы мне отладить такие проблемы, как непреднамеренные циклы ссылок и зависаниересурсы, такие как открытые файлы.
Более простой пример: как мне увидеть ключи подкласса dict
, если программист спрятал keys()
за собственным классом?Обходной путь заключается в том, чтобы вручную вызвать метод dict
keys()
вместо того, чтобы наследование вызывало версию метода подкласса:
# 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']
Теперь мой фактический вопрос: как я могу увидеть * 1011?* Например, независимо от того, что программист мог сделать, чтобы скрыть это от меня?Если они устанавливают переменную класса __dict__
, то она, кажется, затеняет фактические __dict__
любых объектов, унаследованных от этого класса:
# 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'}
Это ложное значение для __dict__
не имеет, как вы можете видетьвмешиваться в фактическую установку и получение атрибутов, но это вводит в заблуждение dir()
, скрывая a
и b
и отображая fake
в качестве переменной экземпляра объекта.
Опять же, моя цель - написатьинструмент, который помогает мне проанализировать экземпляры классов, чтобы увидеть «что на самом деле происходит», когда я задаюсь вопросом, почему набор экземпляров класса занимает так много памяти или держит так много открытых файлов - и даже несмотря на то, что ситуация выше чрезвычайно надумана, поискобходной путь позволил бы инструменту работать все время вместо того, чтобы говорить «отлично работает, если у класса, на который вы смотрите, нет… [описание исключительной ситуации выше]».
Я думал, что будув состоянии безошибочно захватить __dict__
с чем-то вроде:
dict_descr = object.__dict__['__dict__']
print dict_descr(ddh, DunderDictHider)
Но оказывается, что object
не чAve __dict__
дескриптор.Вместо этого функция subtype_dict()
C, кажется, отдельно прикрепляется к каждому подклассу object
, который создает программист;не существует центрального способа присвоения имени или извлечения дескриптора, чтобы его можно было вручную применить к объектам, класс которых его скрывает.
Есть идеи, кто-нибудь?:)