【问题标题】:How can we get a definitive list of everything (or nearly everything) stored in a python object?我们如何才能获得存储在 python 对象中的所有内容(或几乎所有内容)的明确列表?
【发布时间】:2018-10-30 15:57:33
【问题描述】:

当我说“存储”时,我主要指的是属性,而不是容器元素或__getitem__ 返回的值。

我的第一个想法是用object.__getattribute__ 绕过任何重载的__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 似乎返回类方法,但我想要ONLY属于对象的数据,而不是属于实例化对象的类的数据。

鉴于以下情况: obj = 克拉斯() obj.foo()

通常是真的:

obj = Klass()
Klass.foo(obj)

fooKlass 字典中的数据,而不是objs。为了将foo 应用于obj,您必须将obj 作为输入传递给Klass 的foo 方法。然后Klass.foo 就地修改obj,或者可能只读取obj

Klass 大概分两步从obj 访问:

  1. obj 的字典中查找键(又名字符串)__class__
  2. Klass 的字典的键中搜索foo(或任何方法名称)

我们如何获得obj的字典条目?如果obj 中的字典(键、值)对之一是对Klass 的引用,那很好,我只是不希望将方法或类成员变量存储在Klass 中。我想要obj 的字典直接指向的数据(和键)。 我将方法访问称为“直接”,因为在obj 的字典中查找会将我们带到klass 的字典中,以查找我们的搜索目标(方法foo)。

【问题讨论】:

  • vars(some_object)?
  • 看起来你需要的 C API 介绍比你知道的要多。您将了解如何在内置类中实现属性,以及为什么您的问题几乎毫无意义。
  • @juanpa.arrivillaga vars()list 类的实例提供TypeError: vars() argument must have __dict__ attribute
  • 是的。所以?您对list 对象的期望到底是什么?我真的不明白你在期待什么......
  • 您是否将列表的长度或分配的缓冲区大小视为属性?它们与每个实例一起存储,但您永远无法通过 Python 代码访问它们。

标签: python python-3.x dictionary getattribute python-object


【解决方案1】:

这完全是邪恶的,并且没有给出名字,但是...gc.get_referents() 非常接近。来自文档:

gc.get_referents(*objs)

返回任何参数直接引用的对象列表。返回的引用是由参数的 C 级 tp_traverse 方法(如果有)访问的那些对象,并且可能并非所有对象实际上都是可直接访问的。 tp_traverse 方法仅由支持垃圾回收的对象支持,并且只需要访问可能参与循环的对象。因此,例如,如果一个整数可以从一个参数直接访问,那么该整数对象可能会或可能不会出现在结果列表中。

【讨论】:

    最近更新 更多