我有一个Python 2.7类(称为子类),它是另一个类(父类)的子类,该类本身是dict的子类。
我正在尝试在Child中定义__iter__
,希望当某人执行dict(child_object)
时,我可以控制如何将其转换为字典。不过,我一定会误解,因为看来dict()调用完全绕过了调用__iter__
,而是转到了基础dict。
我做了一些研究,从dict()方法的文档中,我发现它可能首先将对象视为映射,因此使用了它而不是可迭代的__iter__
。是这种情况,如果是这样,有没有办法我可以覆盖映射上正在调用的某些方法?
答案 0 :(得分:2)
当您在映射上使用dict()
(或使用dictionary.update(...)
传递映射)时,Python将不会使用__iter__
。 Python寻找.keys()
方法来检测映射。在这种情况下,如果映射恰好是dict
或dict的子类,则将选择一条直接从基础C结构直接复制键值对的快速路径。您无法使用自定义Python函数阻止这种情况。
换句话说,如果必须定义一个自定义映射类型来控制dict()
如何从中复制键值对,则不应子类化dict
。通过子类collections.Mapping
或collections.MutableMapping
或UserDict
module中的类来实现自己的映射类型。