对于Python 3.4:为什么在子类defaultdict,覆盖__init__和在子类的范围内定义default_factory时会得到KeyError?

时间:2014-07-22 18:51:40

标签: python python-3.4 defaultdict

以下代码不会引发KeyError。

from collections import defaultdict


class A(defaultdict):

    def __init__(self):
        self.default_factory = int


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

以下代码引发了KeyError。

from collections import defaultdict


class A(defaultdict):

    def __init__(self):
        pass


class B(A):

    default_factory = int


b = B()
print(a[42])  # out: KeyError: 42

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

1)在构建A对象时调用父__init__类的b方法

2)参考不存在的密钥defaultdict

,调用__missing__班级的42方法

3)仅参考b对象的default_factory属性才能找到此类属性

4)参考B班级的属性,找到定义为default_factory的{​​{1}}

5)将int返回int班级defaultdict方法

6)致电__missing__default_factory),默认返回int 0

7)将__missing__对象的键b值定义为42

8)打印0

也许我对第2步有误?我的哪些假设是不正确的,或者我的第一个和第二个例子之间的关键区别是什么?

1 个答案:

答案 0 :(得分:1)

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

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

第2步发生,但此步骤在C中实现为使用:

PyObject *factory = dd->default_factory;

default_factory仅定义为实例的成员。请参阅defaultdict C source