我们如何获得存储在python对象中的所有(或几乎所有内容)的确定列表?

时间:2018-05-21 02:42:02

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

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

我的第一个想法是绕过任何带有__getattribute__的重载object.__getattribute__方法(aka,dot-operator)。我以为我会用字典来获取一个未被遮挡的对象。但是,并非所有对象都具有__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 = Klass()     obj.foo()

通常是:

obj = Klass()
Klass.foo(obj)

fooKlass字典中的数据,而非obj s。要将foo应用于obj,您必须将obj作为输入传递到Klass的foo方法。然后Klass.foo就地修改obj,或者只修改obj

可能会从Klass分两步访问

obj

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

    我们如何获得 obj的词典条目?如果obj中的一个字典(键,值)对是Klass的引用,那很好,我只是不希望方法或类成员变量存储在Klass中。我希望obj的词典直接指向 的数据(和键)。 我会称方法访问&#34; in-direct&#34;由于obj字典中的查找会将我们带到klass的字典,以便找到我们搜索的目标(方法foo

1 个答案:

答案 0 :(得分:0)

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

  

gc.get_referents(*objs)

     

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