以下代码不会引发键错误。
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>}
也许我对第二步错了?我的假设中哪一个是错误的,或者我的第一个和第二个例子之间有什么关键区别?
defaultdict
不是Python类,而是C类型。因此,它不支持在类上查找属性,它只支持在实例上设置default_factory
。在换句话说,第4步永远不会发生。在
步骤2确实发生了,但这一步在C中实现如下:
并且} C source 。在
default_factory
仅定义为实例的成员。参见^{相关问题 更多 >
编程相关推荐