Как мы можем получить окончательный список всего (или почти всего), хранящегося в объекте python? - PullRequest
0 голосов
/ 21 мая 2018

Когда я говорю «сохраненный», я в основном имею в виду атрибуты, а не элементы контейнера или значения, возвращаемые __getitem__.

Моя первая мысль состояла в том, чтобы обойти любой перегруженный метод __getattribute__ (он же, точка-оператор)с object.__getattribute__.Я думал, что тогда я получу объекты без словаря со словарем.Однако не все объекты имеют атрибут __dict__, включая встроенный тип list;Следующий код ...

lyst  = list()
dct = object.__getattribute__(lyst, '__dict__')

... вызывает ошибку атрибута:

Traceback (most recent call last):

  File "E:/python_playpen/playpen_object_dict.py", line 25, in <module>
    dct = object.__getattribute__(sidgfisdgf, '__dict__')
AttributeError: 'list' object has no attribute '__dict__'

Process finished with exit code 1

Однако list имеет метод dir.Следующий код не выдает ошибку.

object.__getattribute__(lyst, '__dir__')()

object.__dir__(lyst)

Почти каждый ли объект Python имеет метод dir?

dir, кажется, возвращает методы класса, но я хочу ТОЛЬКО данные, принадлежащие объекту, а не данные, принадлежащие классу, из которого создается объект.

При условии, что следующее: obj = Klass () obj.foo()

обычно действительно:

obj = Klass()
Klass.foo(obj)

foo - это данные в словаре Klass, а не obj s.Чтобы применить foo к obj, вы должны передать obj в качестве ввода в метод foo Klass.Затем Klass.foo изменяет obj на месте или, возможно, читает только из obj.

Klass предположительно доступен из obj в два этапа:

  1. найдите ключ (также известный как строка) __class__ в словаре obj.
  2. Найдите foo (или как там ни зовут метод) в ключах Klass 's словарь

Как получить только obj словарные записи?Если одна из пар словаря (ключ, значение) внутри obj является ссылкой на Klass, это нормально, я просто не хочу, чтобы методы или переменные-члены класса хранились внутри Klass.Мне нужны данные (и ключи), которые словарь obj указывает на напрямую .Я бы назвал доступ к методу «in-direct», так как поиск в словаре obj приводит нас к словарю klass на нашем пути, чтобы найти цель нашего поиска (метод foo).

1 Ответ

0 голосов
/ 21 мая 2018

Это полностью зло и не дает имен, но ... gc.get_referents() довольно близко.Из документов:

gc.get_referents(*objs)

Возвращает список объектов, на которые непосредственно ссылается любой из аргументов.Возвращаемыми ссылками являются те объекты, которые были посещены аргументами C-level tp_traverse (если они есть), и они могут быть не всеми объектами, доступными непосредственно.Методы tp_traverse поддерживаются только объектами, поддерживающими сборку мусора, и требуются только для посещения объектов, которые могут участвовать в цикле.Так, например, если целое число напрямую доступно из аргумента, этот целочисленный объект может появиться или не появиться в списке результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...