Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对象没有属性'__dict';在蟒蛇3中_Python_Python 3.x - Fatal编程技术网

Python 对象没有属性'__dict';在蟒蛇3中

Python 对象没有属性'__dict';在蟒蛇3中,python,python-3.x,Python,Python 3.x,我有一个测试在Python2中通过,而在Python3中失败,我正在试图找出原因。测试在以下线路失败: self._timeseries[0].resource.__dict__ 错误如下: AttributeError: 'Resource' object has no attribute '__dict__' 如果我调试测试,并在调试器中打印对象,我可以看到以下内容: (Pdb) p self._timeseries[0].resource.__dict__ OrderedDict([(

我有一个测试在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__'

你知道为什么会这样吗?如果我在调试器中打印对象时没有使用
。\uuuudict\uuuuuuu
,那么该对象看起来完全一样,为什么Python3会失败?

我编写了一个小函数,我可能缺少一些边缘情况,但它满足了我编写的几个小测试情况(可能因多次继承而中断)


所以我在一些挖掘之后找到了答案,这确实是Python2和Python3之间的区别,一个令人讨厌的区别

代码中的类型
Resource
实际上是一个命名元组。在Python2中,
\uuu dict\uuu
被添加为
\u asdict()
的方便属性包装器,但在Python3中没有这样做:

(在此处查找
\uuuu dict\uuuu

所以它看起来像是
。\u asdict
实际上是真相的来源,应该用于可移植的2to3代码


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

可能是任何库将此类型更改为python3中的
\uuuu\uuu
对象?如果看不到类定义和更多信息,就不可能知道。在这种情况下,有没有办法获取动态定义的属性?执行
。\uuuu插槽\uuuu
只返回
()
。这相当令人惊讶。
self.timeseries[0].resource
应该是什么?在Python2和Python3中,当我检查任意对象的
\uuuu dict\uuu
时,我得到一个
dict
类型的对象,而不是
OrderedDict
类型的对象。我的猜测是,将Python2设置为
resource
OrderedDict类型的
\uu dict\uu
属性的方法在Python3中不起作用。@Rightleg你说得对,这很有趣。但是我不容易发现,所以我想我永远也不知道这是怎么回事。听起来很奇怪,我在玩命名元组,我发现了一些奇怪的事情:当你创建一个命名元组,然后实例化它时,该实例的
\u dict\u
是一个
有序的dict
。可能是您的Python 2测试导入了
集合
,而您的Python 3测试却忘记了这么做吗?这太棒了,我非常赞赏您的努力!这应该行得通。然而,在我的情况下,我只需要调用
。\u asdict()
,请看下面我的答案。很好!我不知道在
名为tuple
的网站上曾经有一个
\uu dict\uuuu
,我很高兴他们删除了它:)<代码>变量也存在于python3中。我刚才在你最初的问题上做了类似的评论,只是想看看你已经发布了这个答案。伟人的想法是一样的:)注意:
vars
存在于Py2和Py3中,但它基本上是一个薄包装,相当于在给定的参数上查找
\u dict\u
,因此当他们用
namedtuple
修复错误时,它停止工作。在继承层次结构中使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>插槽的用户定义类(没有一个
\uuuuuuuuuu一组类级属性,用于访问存储在C级对象元数据中的值,该元数据没有与
\uuuu dict\uuu
等效的值。
class C(object):
    def __init__(self):
        self.x = 1
        self.y = 1


class D(object):
    __slots__ = ('x', 'y')
    def __init__(self):
        self.x = 1
        self.y = 1


class E(D):
    __slots__ = ()


class F(D):
    __slots__ = ('z',)
    def __init__(self):
        super(F, self).__init__()
        self.z = 1


def vars2(x):
    if hasattr(x, '__dict__'):
        return vars(x)
    else:
        ret = {slot: getattr(x, slot) for slot in x.__slots__}
        for cls in type(x).mro():
            spr = super(cls, x)
            if not hasattr(spr, '__slots__'):
                break
            for slot in spr.__slots__:
                ret[slot] = getattr(x, slot)
        return ret


def main():
    print(vars2(C()))
    print(vars2(D()))
    print(vars2(E()))
    print(vars2(F()))
    OUTPUT = '''\
{'y': 1, 'x': 1}
{'y': 1, 'x': 1}
{'y': 1, 'x': 1}
{'y': 1, 'x': 1, 'z': 1}
'''

if __name__ == '__main__':
    exit(main())