【发布时间】: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)
foo 是Klass 字典中的数据,而不是objs。为了将foo 应用于obj,您必须将obj 作为输入传递给Klass 的foo 方法。然后Klass.foo 就地修改obj,或者可能只读取obj。
Klass 大概分两步从obj 访问:
- 在
obj的字典中查找键(又名字符串)__class__。 - 在
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