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

Когда я говорю "сохранено", я имею в виду, в основном, атрибуты, а не элементы контейнера или значения, возвращаемые __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словарь, не objs. Для того, чтобы подать заявку foo в obj ты должен пройти obj как вход в KlassФу метод. затем Klass.foo модифицирует obj на месте, или, возможно, только читает из obj,

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

  1. ищите ключ (он же строка) __class__ в objсловарь.
  2. Ищи foo (или каково бы ни было имя метода) в ключах Klassсловарь

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

1 ответ

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

gc.get_referents(*objs)

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

Другие вопросы по тегам