我有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
答案 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)