2011-03-29 12 views
2

저는 현재 "Dive Into Python"을 통해 언어를 선택하고 있습니다. 제 5 장의 예제 5.10에 대해 약간 혼란 스럽습니다. UserDict 일반 방법파이썬에서 데이터를 반환했습니다.

예 5.10. UserDict를 정상적인 방법 data는 사전입니다

def copy(self): 
    if self.__class__ is UserDict: 
     return UserDict(self.data) 
    import copy 
    return copy.copy(self) 

합니다.

클래스가 UserDict 유형이면 UserDict(self.data)을 반환합니다. 내가 혼동스러워하는 이유는 대신에 UserDict(self.data)을 돌려 주어야하는 이유는 무엇입니까? self.data가 반환 할 수있는 사전이 아닙니까?

누군가가 UserDict(self.data)self.data을 반환하는 것의 차이점을 설명 할 수 있다면 크게 감사하겠습니다.

+0

여러분, 모두 도와 주셔서 감사합니다. 정말 감사. – foboi1122

답변

1

복사본을 얻으려면 UserDict(self.data)을 사용해야합니다.

우리가 self.data 대신 UserDict(self.data)을 사용하는 이유는 자체와 동일한 클래스 인 새 인스턴스를 반환한다는 것입니다.

self.data 만 반환하면 복사본을 만들지 않았습니다. 을 반환하기 때문에 UserDict이 아닌 인스턴스를 반환합니다. 복사본을 만들려면 UserDict(self.data)을 사용해야합니다.

2

.copy()은 동일한 유형의 개체를 반환 할 것으로 예상되므로 새 UserDict 개체를 반환합니다.

0

여기서는 최적화에 대해 설명합니다.

UserDict을 기본 클래스로 사용하여 고유 한 서브 클래스를 작성할 수 있습니다. 하위 클래스의 copy() 메서드를 재정의하지 않으면 기본 클래스의 항목 (예 : 여기에서보고있는 항목)을 가져옵니다.

그래서 기본적으로 하위 클래스에서 실행 중인지 확인합니다. 그렇지 않다면 자체 복사본을 만드는 가장 빠른 방법은 자체 생성자를 사용하는 것입니다. 그러나 하위 클래스에서 실행중인 경우 추가 한 항목과 복사해야하는 항목을 알지 못하므로 copy 모듈의 일반 복사 기능을 사용합니다. 이렇게 빠른 것은 아니지만 복사해야 할 항목을 복사 할 가능성이 큽니다. self.datadict 아닌 UserDict 때문에 그것은 self.data을 반환하지 않습니다

(물론, 당신이 UserDict를 서브 클래스 경우 당신은 어쩌면 ... 자신의 copy() 방법을 써야한다), 그리고 사본이 아니다.

관련 문제