当我说"存储"我主要是指属性,而不是__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)
foo
是Klass
字典中的数据,而非obj
s。要将foo
应用于obj
,您必须将obj
作为输入传递到Klass
的foo方法。然后Klass.foo
就地修改obj
,或者只修改obj
。
Klass
分两步访问 obj
:
__class__
词典中查找密钥(又名字符串)obj
。foo
词典Klass
(或任何方法名称)
醇>
我们如何获得 obj
的词典条目?如果obj
中的一个字典(键,值)对是Klass
的引用,那很好,我只是不希望方法或类成员变量存储在Klass
中。我希望obj
的词典直接指向 的数据(和键)。
我会称方法访问&#34; in-direct&#34;由于obj
字典中的查找会将我们带到klass
的字典,以便找到我们搜索的目标(方法foo
)
答案 0 :(得分:0)
这完全是邪恶的,并没有给出名字,但...... gc.get_referents()
非常接近。来自文档:
gc.get_referents(*objs)
返回由任何参数直接引用的对象列表。返回的引用对象是由参数'C级tp_traverse方法(如果有)访问的对象,并且可能不是所有对象实际上都可以直接访问。 tp_traverse方法仅受支持垃圾收集的对象的支持,并且只需访问可能涉及循环的对象。因此,例如,如果可以从参数直接访问整数,则该整数对象可能会也可能不会出现在结果列表中。