对于Python3.4:为什么我在子类defaultdict、重写\uUinit_Uu并在子类的作用域中定义default_factory时会得到KeyError?

2024-09-28 03:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码不会引发键错误。

from collections import defaultdict


class A(defaultdict):

    def __init__(self):
        self.default_factory = int


a = A()
print(a[42])  # out: 0

以下代码引发了一个键错误。

^{pr2}$

在我有缺陷的想象中,第二个例子是这样的:

1)在^{{cd3>}对象的构造中调用父^{cd1>}类的^{cd2>}方法

2)参考不存在的密钥^{cd6>}调用^{cd4>}类的^{cd5>}方法

3)仅参考^{cd3>}对象的^{cd8>}属性,以查找不到此类属性

4)参考^{cd9>}类的属性,以查找^{{cd8>}定义为^{{cd11>}

5)返回^{cd11>}返回^{cd4>}类的^{cd5>}方法

6)调用^{cd8>}(即^{cd11>}),默认情况下,它将^{{cd17>}返回^{{cd5>}

7)将^{cd3>}对象的key^{cd6>}值定义为^{cd17>}

8)打印^{cd17>}

也许我对第二步错了?我的假设中哪一个是错误的,或者我的第一个和第二个例子之间有什么关键区别?


Tags: 对象方法代码self属性错误例子defaultdict
1条回答
网友
1楼 · 发布于 2024-09-28 03:24:46

defaultdict不是Python类,而是C类型。因此,它不支持在类上查找属性,它只支持在实例上设置default_factory。在

换句话说,第4步永远不会发生。在

步骤2确实发生了,但这一步在C中实现如下:

PyObject *factory = dd->default_factory;

并且default_factory仅定义为实例的成员。参见^{} C source。在

相关问题 更多 >

    热门问题