Python defaultdict对象的属性引发了AttributeError

时间:2017-12-13 01:53:12

标签: python defaultdict

我有Python 2.7代码,使用email创建一个字典defaultdict,创建mydict的默认对象,如下所示。

我的理解是,如果defaultdict中不存在键MyClass,那么将创建一个foo的新对象,因为我有一个MyClass方法,那么属性__init__()也会存在。那么为什么下面的代码不起作用,我在哪里:

value

但是,此代码 工作:

print mydict['foo'].value # Raises AttributeError

解决错误的正确方法是什么? (顺便说一句,我是C ++ / Java程序员。)

以下是整个代码:

mydict['foo'].value = 1 # Works fine

结果:

from collections import defaultdict

class MyClass(object):
    def __init__(self):
        self.value = 0

mydict = defaultdict(lambda: MyClass)
print mydict['foo'].value # Raises AttributeError
#mydict['foo'].value += 1 # Raises AttributeError
#mydict['foo'].value = 1 # Works fine

1 个答案:

答案 0 :(得分:3)

当你指定defaultdict(lambda: MyClass)时,默认dict产生的是MyClass定义(通过lambda),它没有value,因为它没有在类中定义,因为是使用该特定构造返回的内容(默认dict将调用它构造的第一个参数,如果它是一个可调用对象,您可以在问题中包含的异常消息中自己看到)。见这个例子:

>>> MyClass.value
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'MyClass' has no attribute 'value'
>>> mydict['foo'].value = 1
>>> MyClass.value
1

如果你真的想要返回原始类,那么提供那样的值属性(但它将在所有默认值中共享)

class MyClass(object):
    value = None

或者做你真正想要的,也就是提供类的默认实例,你可以在lambda中手动调用它,或者将它简化为:

mydict = defaultdict(MyClass)