Python对象的__iter__没有被调用

博萨克

我有一个Python 2.7类(称为子类),它是另一个类(父类)的子类,该类本身是dict的子类。

我试图__iter__在Child中定义,希望当有人这样做时,dict(child_object)我可以控制将其转换为dict的方式。我一定会误会,因为似乎dict()调用__iter__完全绕过了调用,而是转到底层dict。

我做了一些研究,从dict()方法的文档中,我发现它可能首先将对象视为映射,因此使用了它而不是iterable的映射__iter__是这种情况,如果是这样,有没有办法我可以覆盖映射上正在调用的某些方法?

马丁·彼得斯(Martijn Pieters)

当您dict()在映射上使用(或使用dictionary.update(...)传递映射)时,Python将不会使用__iter__Python寻找一种.keys()检测映射方法。在这种情况下,如果映射恰好是dict dict的子类或子类,则将选择一条直接从基础C结构直接复制键值对的快速路径。您无法使用自定义Python函数阻止这种情况。

换句话说,如果必须定义一个自定义映射类型来控制dict()复制键-值对的方式,则不应子类化dict通过子类化collections.Mapping模块中collections.MutableMapping的类来实现自己的映射类型UserDict

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Python中,在调用__iter__时“重置”迭代器是一种不好的做法吗?

为什么python 2.7中的字符串不具有“ __iter__”属性,但是python 3.7中的字符串具有“ __iter__”属性

Scrapy:“ str”对象没有属性“ iter”

Python - __iter__ 的内部工作原理

Python是否允许递归__iter__函数?

将生成器包装为具有单个`next`调用,而不是两个步骤(__iter__ + __next__)

NetworkX模块python中的'Graph'对象没有属性'nodes_iter'

Python Boto3“ StreamingBody”对象没有属性“ iter_lines”

如何让list()消耗__iter__而不调用__len__?

在__iter__方法中返回self有什么用?

AttributeError:“列表”对象没有属性“ iter_rows”

AttributeError:“模块”对象没有属性“调用”:Python

在__iter__中使用

关于内置的__iter__

Python迭代器是否正式需要__iter__方法?

如何继承python生成器并覆盖__iter__

Python 3:如何为派生类编写__iter__方法,以便它扩展基类的__iter__方法的行为

为什么mypy如果具有__len__和__getitem__但没有__iter__,则不将其视为可迭代的类

处理提早__iter__终止

调用没有对象或传递值的函数

为什么实现__iter__的对象不被认为是可迭代的?

有没有办法动态检索对象方法并在python中调用它们?

为什么我得到AttributeError:'LinearRegressionGD'对象没有属性'n_iter'

返回的调用函数对象没有显示相同的结果吗?Python3.x

Python:AttributeError:在for循环内调用方法时,'str'对象没有属性

Python 3导入错误AttributeError:从C ++调用脚本时,'_ModuleLock_'对象没有属性'name'

Python-AttributeError: 'int' 对象在尝试调用 NetworkX 上的 GML 文件时没有属性 'decode'"

如何在Python中使用__iter__和__next__进行迭代?

有没有办法从方法中调用对象?