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