2017-12-13 9 views
0

defaultdict을 사용하는 Python 2.7 코드에서 MyClass의 기본 객체를 만드는 사전 mydict을 만들었습니다.Python defaultdict 객체의 속성이 AttributeError를 발생시킵니다.

나의 이해는 키 foo가 defaultdict에 존재하지 않는 경우, MyClass의 새로운 객체를 생성 할 것, 그리고 내가 __init__() 방법, 다음 속성이 있기 때문에 또한 존재하는 것 value. 그래서 내가 왜이 곳이 아닌 작업 아래의 코드를 수행합니다

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

그러나,이 코드 수행 일 :

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

오류를 해결하는 올바른 방법은 무엇입니까? (나는 방법에 의해하는 C++/자바 프로그래머입니다.) 아래

코드의 전체입니다 :

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 

결과 :

AttributeError       Traceback (most recent call last) 
<ipython-input-16-c9dd776d73de> in <module>() 
     6 
     7 mydict = defaultdict(lambda: MyClass) 
----> 8 print mydict['foo'].value # Raises AttributeError 
     9 #mydict['foo'].value += 1 # Raises AttributeError 
    10 #mydict['foo'].value = 1 # Works fine 

AttributeError: type object 'MyClass' has no attribute 'value' 

답변

3

당신이 defaultdict(lambda: MyClass)를 지정, 무엇을 기본 dict는 MyClass 정의 (λ를 통해)는 value이 없으므로 클래스에 정의되어 있지 않으므로 그 특정 구조와 함께 반환됩니다 (기본 dict는 첫 번째 인수를 호출합니다). 그것은 호출 가능한 객체 인 경우에 만들어졌으며 질문에 포함 된 예외 메시지에서 이미이 객체를 볼 수 있습니다. 당신이 진정, 원시 클래스를 반환 같은 (그러나이 모든 기본 값에서 공유 할 것이다), 그 값 속성

class MyClass(object): 
    value = None 

을 제공하거나 정말 무엇을해야 할 경우

>>> 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 

이 예를 참조하십시오 이 클래스의 기본 인스턴스를 제공하는 것입니다.이 인스턴스는 람다에서 수동으로 호출 할 수 있습니다. 간단히 말해서 :

mydict = defaultdict(MyClass) 
+0

감사합니다. 두 선언'defaultdict (lambda : MyClass)'와'defaultdict (MyClass)'의 차이점은 무엇입니까? – stackoverflowuser2010

+0

'lambda : MyClass'는 기본적으로'return MyClass'라는 인자를 취하지 않는 함수입니다. 이것은'MyClass' 클래스 정의를 반환합니다. – metatoaster

+0

'defaultdict (lambda : MyClass)'를 사용할 때'mydict [ 'foo']. value = 1' 문이 작동하는 이유를 설명 할 수 있습니까? 당신의 주장에 따르면'lambda '를 사용하면'value' 멤버 변수가 존재하지 않아야합니다. – stackoverflowuser2010