当我说“存储”时,我主要指的是属性,而不是容器元素或__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)
foo是Klass's 字典中的数据,而不是objs。为了适用foo于您,obj您必须将obj其作为输入传递给Klass' 的 foo 方法。然后就地Klass.foo修改,或者可能只从.objobj
Klass大概可以通过obj两个步骤访问:
__class__在obj的字典中查找键(又名字符串) 。- 在's 字典的键中搜索
foo(或任何方法名称)Klass
我们如何获得only obj的字典条目?如果里面的字典(键,值)对之一obj是对 的引用Klass,那很好,我只是不希望将方法或类成员变量存储在Klass. 我想要字典直接obj指向的数据(和键)。我将方法访问称为“直接”,因为在' 字典中的查找将我们带到' 字典以查找我们的搜索目标(方法)。objklassfoo