1

当我说“存储”时,我主要指的是属性,而不是容器元素或__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)

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

Klass大概可以通过obj两个步骤访问:

  1. __class__obj的字典中查找键(又名字符串) 。
  2. 在's 字典的键中搜索foo(或任何方法名称)Klass

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

4

1 回答 1

0

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

gc.get_referents(*objs)

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

于 2018-05-21T03:11:15.293 回答