UserDict 상속하기

매일 공부(ML)·2022년 11월 14일
0

Fluent Python

목록 보기
17/130

딕셔너리와 집합

UserDict 상속하기

  • dict보다 UserDict를 상속해서 매핑형을 만드는 것이 쉬운 이유는 매핑에 추가한 키를 문자열로 저장하기 위해선 StrKeyDict0을 확장했던 것처럼 UserDict의 값을 평가할 수 있다.

  • 내장형에서는 아무런 문제없이 상속할 수 있는 메서들을 오버라이드해야 하는 구현의 특이성으로 인해서 dict보다는 UserDict를 상속하는 것이 낫다.

  • UserDict는 dict를 상속하지 않고 내부에 실제 항목을 담고 있는 data라고 하는 dict객체를 가지고 있기에 setitem()등의 특수 메서드를 구현할 때 발생하는 원치 않는 재귀적 호출을 피할 수 있고, contains()메서드를 간단히 구현할 수 있다.

  • UserDict 덕분에 StrKeyDict는 StrKeyDict0보다 간단하고 더 많은 일을 하도록 구현하기에 모든 키를 str형으로 저장함으로써 비문자열키로 객체를 생성하거나 갱신할 때 발생할 수 있는 예기치 못한 문제를 피하게 해준다.

#삽입, 갱신, 조회할 때 비문자열 키를 항상 문자열로 변환하는 StrKeyDict

import collections

class StrKeyDict(collections.UserDict):

	def __missing__(self,key):
    	if isinstance(key,str):
        	raise KeyError(key)
        return self[str(key)]
        
    def __contains__(self, key):
    	return str(key) in self.data
        
   def __setitem__(self, key, item):
   		self.data[str(key)] = item

UserDict 클래스가 MutableMapping을 상속하므로 StrKeyDict는 결국 UserDict, MutableMapping 혹은 Mapping을 상속하게 되어 매핑의 모든 기능을 가지게 되고 Mapping은 추상 베이스 클래스임에도 불구하고 유용한 구상(구체적인) 메서드를 다수 제공한다.


MutableMapping.update()

강력한 메서드는 직접 호출할 수 있지만, 다른 매핑이나 (키,값)쌍의 반복형 및 키워드 인수에서 객체를 로딩하기 위해서 init()에 의해서 사용이 될 수 있고 항목을 추가하기 위해서 'self[키]= 값'구문을 사용해서 결국 서브 클래스에서 구현한 setitem()메서드를 호출하게 된다.


Mapping.get()

StrKeyDict0에서는 getitem()과 일치하는 결과를 가져오기 위해서 get()메서드를 직접 구현해야 헸지만, StrKeyDict0.get()과 완전히 동일하게 구현된 Mapping.get()을 상속 받는다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글