当前位置:  开发笔记 > 编程语言 > 正文

对象在python3中没有属性'.__ dict__'

如何解决《对象在python3中没有属性'.__dict__'》经验,为你挑选了1个好方法。

我有一个在Python2中传递但在Python3中失败的测试,我试图找出原因.测试在以下行失败:

self._timeseries[0].resource.__dict__

有错误:

AttributeError: 'Resource' object has no attribute '__dict__'

如果我调试测试,并在调试器中打印对象,我可以看到以下内容:

(Pdb) p self._timeseries[0].resource.__dict__
OrderedDict([('type', 'type_value'), ('labels', {'label1': 'value1', 'label2': 'value2', 'label3': 'value3'})])

如果我在Python3调试器中执行相同操作,我会得到:

(Pdb) p self._timeseries[0].resource.__dict__
*** AttributeError: 'Resource' object has no attribute '__dict__'

任何想法为什么会这样?如果我在没有调试器的情况下将它打印出来,那么该对象看起来完全一样.__dict__,为什么Python3会失败呢?



1> yelsayed..:

所以我在经过一些挖掘后找到了答案,这确实是Python2和Python3之间的差异,这是一个非常重要的.

事实证明,Resource代码中的类型实际上是一个命名元组.在Python2中,.__dict__添加为方便的属性包装器._asdict(),但这不是在Python3中完成的:

https://docs.python.org/2/library/collections.html#collections.somenamedtuple._asdict(在__dict__此处查找) https://docs.python.org/3/library/collections.html#collections.somenamedtuple._asdict

所以它看起来._asdict实际上是事实的来源,应该用于便携式2to3代码.

值得一提的是,vars它也是仅存在于Python2中的包装器.


注意:Py2和Py3中存在`vars`,但基本上是一个薄包装器,等效于在给定的参数上查找'__dict__`,因此当他们使用`namedtuple`修复该错误时,它便停止工作。在整个继承层次结构中使用__slots__的用户定义的类(都不具有__dict__插槽)将始终会出现此问题,因为它们将__dict__的使用替换为(有效地)使用了一系列访问值的类级别属性存储在C级对象元数据中,该元数据与`__dict__`不等效。
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有