Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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对象';没有人给你打电话_Python_Python 2.7_Object_Inheritance - Fatal编程技术网

Python对象';没有人给你打电话

Python对象';没有人给你打电话,python,python-2.7,object,inheritance,Python,Python 2.7,Object,Inheritance,我有一个Python2.7类(称为Child),它是另一个类(父类)的子类,它本身就是dict的子类 我试图在Child中定义\uu iter\uuu,希望当有人执行dict(Child\u object)时,我可以控制它如何转换为dict。不过我一定是误解了什么,因为它似乎是dict()call完全绕过调用\uuuu iter\uuuu,而是转到底层dict 我做了一些研究,从dict()方法的文档中我看到它可能首先将对象视为一个映射,因此使用它而不是iterable的\uuuuuuuuuuu

我有一个Python2.7类(称为Child),它是另一个类(父类)的子类,它本身就是dict的子类

我试图在Child中定义
\uu iter\uuu
,希望当有人执行
dict(Child\u object)
时,我可以控制它如何转换为dict。不过我一定是误解了什么,因为它似乎是dict()call完全绕过调用
\uuuu iter\uuuu
,而是转到底层dict

我做了一些研究,从dict()方法的文档中我看到它可能首先将对象视为一个映射,因此使用它而不是iterable的
\uuuuuuuuuuuuuuu
。是这样的吗?如果是这样的话,有没有办法覆盖映射中调用的某个方法?

当您在映射中使用
dict()
时(或者使用
dictionary.update(…)
传递映射),Python将不会使用
\iter\uu
。Python寻找
.keys()
方法来检测映射。在这种情况下,如果映射恰好是dict的一个
dict
或一个子类,那么将选择一个快速路径,直接从底层C结构复制键值对。使用自定义Python函数无法防止这种情况


换句话说,如果必须定义一个自定义映射类型,以控制
dict()
如何从中复制键值对,则不应将
dict
子类化。通过子类化或中的类来实现您自己的映射类型。

您能为您的问题添加一个简单的示例吗?这会让你更容易理解你的意思。不要从
dict
继承,而是从
集合继承。UserDict
否则,当你覆盖它们时,特殊方法将无法工作。谢谢,这证实了我的怀疑。我看到UserDict文档说“这个类的需求已经被直接从dict生成子类的能力所取代”,所以我选择了dict。